常州工学院数字图像处理及应用2022-2023第二学期实验报告 + 期末

                                《数字图像处理及应用》

课程

实验报告书

专业班级:

21计二

姓    名:

王梓权

学    号:

21030228

指导教师:

徐则中

计算机信息工程学院

《数字图像处理》实验

  • 实验教学目的和要求

《数字图像处理》课程内容是一门综合性很强的专业课程。主要内容是对采集的数字图像进行处理,包括:图像变换、图像增强、图像恢复、图像分割、图像分析与理解、图像压缩等各种图像处理算法的基本理论、方法和技术。

通过本课程的学习,使学生掌握有关数字图像处理与分析的基本概念、基础理论、实用技术和典型方法。使学生了解图像变换与增强、图像分割与理解的技术方法,为将来的研究和应用打下良好的基础。

通过实验环节,加强学生对所学数字图像处理知识的深入理解,增强对数字图像处理的感性认识,掌握图像处理技术的基本实现步骤。为今后进行各种有关数字图像处理程序的编制和开发打下良好的基础。

1、掌握数字图像的基本变换,通过线性或非线性灰度变换、直方图均衡算法等,增强图像质量。

2、掌握数字图像的一般分割技术,从数字图像中提取目标对象的轮廓形状,用于进一步的分析处理。

3、掌握在Visual Studio 下用C++编写程序、调试程序,实现数字图像处理算法、开发简单的图像处理应用程序。能够对图像处理结果进行分析、评价。 

二、实验项目表

序号

实   验   名   称

学时数

1

图像变换与增强

2

2

图像分割与理解

2

三、主要实验仪器及材料 

微型计算机、Visual Studio C++编程环境。 

四、考核方式

1、每一次实验指导教师应对其实际上机的预习情况、操作情况和实验报告完成情况进行综合评价,并给出综合成绩。

2、学期结束,对所有实验的成绩进行综合,其成绩作为期末成绩的一部分。

五、教材及参考书

1、R. C. Gonzalez, R. E. Woods,《数字图像处理》(第二版)北京:电子工业出版社,2003。

2、章毓晋,《数字图像处理基础教程》,北京:清华大学出版社,2012。

3、章民武,《图像处理与图像分析基础》,北京:清华大学版社,2021。


数字图像处理编程基础

一、编程框架

二、算法程序模版

灰度图像处理:

void CDipXuzzView::OnDemo()

{    //代码示例

CClientDC dc(this);

CDipXuzzDoc* pDoc = GetDocument();   //获得文档

LPSTR lpDIB;                       //指向DIB的指针

     long lWidth, lHeight;                 //图像宽度和高度

     LONG lLineBytes;

LPSTR lpDIBBits;                   //指向DIB的象素的指针

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

lpDIBBits = ::FindDIBBits(lpDIB);

lWidth = ::DIBWidth(lpDIB);   //DIB 宽度

lHeight = ::DIBHeight(lpDIB); //DIB 高度

lLineBytes = WIDTHBYTES(lWidth * 8);

if (::DIBNumColors(lpDIB) != 256)

{

MessageBox("支持256色位图", "系统提示" , MB_ICONINFORMATION | MB_OK);

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

return;

}

unsigned char *lpSrc;

     int i,j;

for(i = 0; i < lWidth; i++)

{

for(j = 0; j < lHeight; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 -j) +ij;

//*lpSrc ;

}

}

pDoc->SetModifiedFlag(TRUE);

pDoc->UpdateAllViews(NULL);

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

}

彩色图像处理:

void CDipXuzzView::OnDemocolor()

{

CDipXuzzDoc* pDoc = GetDocument();

LPSTR lpDIB;                       

LPSTR lpDIBBits;      

    LONG lLineBytes;

    LONG lWidth,lHeight;         

lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

lWidth = ::DIBWidth(lpDIB);   //DIB 宽度

lHeight = ::DIBHeight(lpDIB); //DIB 高度

lLineBytes = WIDTHBYTES(lWidth*8*3);//真彩色一个象素为3个字节

lpDIBBits = (LPSTR)lpDIB + sizeof(BITMAPINFOHEADER);

     unsigned  char *ired,*igreen,*iblue;

int i,j;

for(i=0; i<lWidth; i++)

{

for(j=0; j<lHeight; j++)

{

ired   =  (unsigned  char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3  + 2;

igreen =  (unsigned  char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3  + 1;

iblue  =  (unsigned  char*)lpDIBBits + lLineBytes * (lHeight-1 - j) + i*3  + 0 ;

*ired =;

*igreen =;

*iblue =;

}

}

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

pDoc->SetModifiedFlag(TRUE);

pDoc->UpdateAllViews(NULL);

}


实验一   图像变换与增强

  • 实验目的与要求
  1. 熟悉图像灰度变换的基本原理;掌握线性变换和非线性变换处理的方法;编写图像灰度变换处理的程序。
  2. 根据直方图均衡化的原理,设计直方图均衡化的算法,并编程实现直方图均衡化的功能。
  3. 加强学生运用VC++进行算法设计和编程实现的能力。

  • 实验内容
    1. 采集两幅数字图像,图像整体偏暗、偏亮,图片类型为BMP格式。掌握图像的读写方法。
    2. 根据直方图均衡算法的流程,运用VC++编写程序实现图像直方图均衡算法。
    3. 分别对两幅图像进行增强处理,并对结果进行比较、分析,完成实验报告。

  • 实验的算法、程序及结果
  1. 采集两幅数字图像,图像整体偏暗、偏亮,图片类型为BMP格式。掌握图像的读写方法。

 

2.根据直方图均衡算法的流程,运用VC++编写程序实现图像直方图均衡算法。

以下是图像灰度变换算法(核心代码)

  1. 暗变亮

for (i = 0; i < lWidth; i++)

{

for (j = 0; j < lHeight; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;

temp = 255 - (*lpSrc - 255) * (*lpSrc - 255) / 255.0;

if (temp > 255) temp = 255;

if (temp < 0) temp = 0;

*lpSrc = temp;

dc.SetPixel(lWidth + 10 + i, j, RGB(*lpSrc, *lpSrc, *lpSrc));

}

}

  1. 亮变暗

for (i = 0; i < lWidth; i++)

{

for (j = 0; j < lHeight; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;

temp = (*lpSrc) * (*lpSrc) / 255.0;

if (temp > 255) temp = 255;

if (temp < 0) temp = 0;

*lpSrc = temp;

dc.SetPixel(lWidth + 10 + i, j, RGB(*lpSrc, *lpSrc, *lpSrc));

}

}

3.分别对两幅图像进行增强处理,并对结果进行比较、分析,完成实验报告。

分析:⑴偏暗照片:经过代码中对lpSrc的非线性变换后可以变亮。将原本照片过暗丢失的楼房、天空以及树木等特征以较好的水平进行了还原,使照片质量得到提升。

 

⑵偏亮照片:经过对lpSrc的非线性变换(平方后除以255)后可以变暗。原本照片过亮,导致了景物过白而模糊以及塔身变灰(类似雾天拍摄效果),经过处理较好地还原绝大部分景物的原本状态,塔身也有了类似除雾处理的效果。

 

  • 实验小结

本实验内容是关于对图像进行增强处理本实验中,我选用一张自己拍摄的常州天宁宝塔照片,并使用照片编辑技术,调节照片的亮度,分别得到偏暗和偏亮的2张照片。

本实验中,我使用灰度变换算法对这两张照片进行处理,增强后的照片可以将原本因过暗、过亮而失真的照片处理到近似于原图的效果,整体看来效果较好:①.将原本照片过暗丢失的楼房、天空以及树木等特征以较好的水平进行了还原,使照片质量得到提升;②.原本照片过亮,导致了景物过白而模糊以及塔身变灰(类似雾天拍摄效果),经过处理较好地还原绝大部分景物的原本状态,塔身也有了类似除雾处理的效果。

综上所述,本实验图片增强效果符合目标要求。


实验二   图像分割与理解

  • 实验目的与要求
    1. 熟悉数字图像分割的基本原理,掌握常用的图像阈值分割、边缘检测处理的方法。
    2. 根据图像分割的原理,设计图像分割算法,并编程实现。
    3. 利用VC++编写图像处理算法,加强学生运用VC进行算法设计和编程实现的能力。

  • 实验内容
    1. 采集一幅个人的数字图像,图片类型为BMP格式。
    2. 根据图像区域分割的方法和流程,实现图像分割算法,利用VC++编写程序。
    3. 掌握简单的图像测量方法,在图像分割的基础上,计算个人的身高和臂长参数。
    4. 用所编程序对给定图像进行测试,并对结果进行分析,完成实验报告。

  • 实验的算法、程序及结果
    1. 采集一幅个人的数字图像,图片类型为BMP格式。

    1. 根据图像区域分割的方法和流程,实现图像分割算法,利用VC++编写程序。

thr = 143;

for (i = 0; i < lWidth; i++)

{

for (j = 0; j < lHeight; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - j) + i;

if ((*lpSrc) > thr)

*lpSrc = 255;

else

*lpSrc = 0;

}

}

    1. 掌握简单的图像测量方法,在图像分割的基础上,计算个人的身高和臂长参数。

float calibration = 0.462;//参照量 需要用标定物确定

//寻找最上点

top = lHeight - 1;

black_pixels = 0;

for (i = 0; i < lHeight; i++)

{

black_pixels = 0;

for (j = 0; j < lWidth; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;

{

if (*(lpSrc) == 0)//黑像素  black_pixels++;

}

}

if (black_pixels > 5)

{

top = lHeight - 1 - i;

break;

}

}

//寻找最下点

bottom = 0;

black_pixels = 0;

for (i = 0; i < lHeight; i++)

{

black_pixels = 0;

for (j = 0; j < lWidth; j++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

{

if (*(lpSrc) == 0)//黑像素  black_pixels++;

}

}

if (black_pixels > 5)

{

bottom = i;

break;

}

}

BHeight = (top - bottom) * calibration;

//寻找最左点

left = 0;

for (j = 0; j < lWidth; j++)

{

black_pixels = 0;

for (i = 0; i < lHeight; i++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

{

if (*(lpSrc) == 0)//黑像素  black_pixels++;

}

}

if (black_pixels > 5)

{

left = j;

break;

}

}

//寻找最右点

right = 0;

for (j = lWidth - 1; j >= 0; j--)

{

black_pixels = 0;

for (i = 0; i < lHeight; i++)

{

lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;

{

if (*(lpSrc) == 0)//黑像素  black_pixels++;

}

}

if (black_pixels > 5)

{

right = j;

break;

}

}

BLength = (right - left) * calibration;

CString sgbc;

CClientDC dc(this);

sgbc.Format("身高=%4.3f cm", BHeight);

dc.TextOut(200, lWidth + 30, sgbc);  //列 行值

sgbc.Format("臂长=%4.3f cm", BLength);

dc.TextOut(400, lWidth + 30, sgbc);

    1. 用所编程序对给定图像进行测试,并对结果进行分析,完成实验报告。

分析图像经过灰度化和阈值分割处理后,可以较容易地找出测量所需的4个点,最终通过调整参照量的大小,确认人像的身高臂长。

 

  • 实验小结

本实验首先对目标的彩色照片灰度化,接着对灰度照片进行阈值分割(选定好thr),目的是将图片进行黑白化(即把像素点亮度划分为仅有0和255组成的效果),其次是寻找人物图像的最高点、最低点、最左端和最右端,并通过调整参照量的大小,最终确认出人物的身高与臂长,并在照片下方显示出来。

综上所述,本实验图片测量数据符合真实情况,能够准确反映真实值。

期末考试答案

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4394.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 用户名称高亮和最近路径显示

1、通常情况下&#xff0c;Linux中的路径名称会不断叠加显示&#xff0c;如下图&#xff0c;这样看起来会很长。 2、为了设置路径只是当前最近的文件路径&#xff0c;先进入自己的家目录&#xff0c;然后进入.bashrc&#xff1a; 3、在.bashrc文件中的最后一行加入以下内容…

【Data Studio 2.1.0连接openGauss2.1.0】

Data Studio 2.1.0连接openGauss2.1.0 一、实验环境说明二、配置客户端接入方式三、Data Studio2.1.0连接openGauss数据库 一、实验环境说明 openGauss2.1.0版本Data Studio 2.1.0 版本 二、配置客户端接入方式 【以下操作是omm用户进行】 修改配置文件pg_hba.conf&#xf…

tiny tool - get_file_path_name_by_drop_file

文章目录 tiny tool - get_file_path_name_by_drop_file概述工程效果收获的知识点vs2022工程, 必须自己设置对话框可以接受文件的风格vs2022建立的工程, 默认是unicode编码, 设置剪贴板数据时, 必须要设置为unicode的格式, 否则剪切板中只有第一个字符工程主要实现END tiny too…

【Linux】线程同步(互斥锁和读写锁)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序&#xff0c;以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件&#xff1a;当多个线程同时访问和修改共享资源时&#xff0c;可能会导致竞态条件的发生…

微信小程序的跨页面传参以及data-方法的相关细节

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;微信小程序的跨页面传参以及data-方法的相关细节 目录 前言wx.navigateTo()方法微信小程序传参的几种方式通过data-属性传参关于data-方法配合点击事件传参的细节 前言 其实在学习新东西的过程中&a…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

R+VIC 模型融合实践技术应用及未来气候变化模型预测

目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&#xff0c;由于适用的尺度主要的是中小流域&#xff0c;所以在预测气候变化对水文过程影响等方面都有所不足。 VIC模型…

Web服务器群集:部署Tomcat

目录 一、理论 1.Tomcat 2.JDK 3.Tomcat安装 4.Tomcat优化 5.Tomcat虚拟主机设置 二、实验 1.JDK安装 2.Tomcat安装 3.Tomcat优化 4.Tomcat 虚拟主机配置 三、总结 一、理论 1.Tomcat &#xff08;1&#xff09;概念 Tomcat服务器是一个免费的开放源代码的Web应用…

UE5 读写本地JSON,发送HTTP请求(get)

UE5 读写本地JSON&#xff0c;发送HTTP请求&#xff08;get&#xff09; 没有使用插件&#xff0c;就用UE提供的库开发&#xff08;推荐使用插件VaRest在虚幻商城里有&#xff09; PCHUsage PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new …

vue 启动项目报错:TypeError: Cannot set property ‘parent‘ of undefined异常解决

场景&#xff1a;从git上面拉下来一个项目 npm i 下载完依赖以后 npm run serve 去运行项目的时候 报错TypeError: Cannot set property ‘parent’ of undefined 如图所示 原因&#xff1a;首先排查发现判断得出是less解析失败导致 但是经过长时间的查询解决方案发现是因为v…

DAY39——动态规划part2

1.考虑障碍在起点和终点的特殊状况&#xff0c;可直接返回0 2.判断是否存在障碍物&#xff1a;初始化时需要设置障碍物后的坐标为0

windows环境使用cmake配置pcl

安装环境 cmake版本&#xff1a;cmake-3.26.3-windows-x86_64 pcl版本&#xff1a;PCL 1.13.1 vs版本&#xff1a;vs2022 配置流程 cmake编译准备&#xff1a;新建两个文件夹source和cmake_bin。source用于存放.cpp文件和CMakeLists.txt 文件&#xff1b;cmake_bin存放配置生…