ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:786.91KB ,
资源ID:8519286      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8519286.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(vc++数字图像处理实验指导书.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

vc++数字图像处理实验指导书.docx

1、vc+数字图像处理实验指导书数 字 图像 处 理实验指导书曹江中、何家峰广东工业大学信息工程学院二九年一月前言数字图像处理是信息工程专业一门重要的专业课程。随着图像处理技术的迅速发展和在当今社会中的广泛应用,给数字图像处理课程的教学提出了新的更高的要求。数字图像处理也是一门实践性较强的课程,实验占有重要地位。本实验指导书在分析学生专业特点和知识结构的基础上,选择VC作为编程工具,通过几个主要的图像处理知识点作为实验内容,旨在让学生在较短的实验时间内熟悉数字图像处理实际工程的基本框架、流程,使学生在理论课程学习的同时直接接触、掌握所学知识点的应用,达到培养学生的编程实践能力和学以致用能力的目的。

2、通过对本指导书的使用,为该门课程的课程设计打下良好的基础。本指导书的内容包括:位图格式、VC图像编程基础、基于VC的图像工程实例以及图像的基本处理,如平滑、锐化、区域增强等算法设计等。共8个学时。在数字图像处理的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。(2)学生应认真并且独立完成相应实验内容。(3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。对需编程的实验,写出程序设计说明,给出源程序框图和清单。(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。目录前言 I目录 II实验一 VC图像编程基

3、础 1一. 实验目的 1二. 实验内容和要求 1三. 实验主要仪器设备和材料 1四. 实验原理及方法 1实验二 一个简单的图像处理工程实例 16一. 实验目的 16二. 实验内容和要求 16三. 实验主要仪器设备和材料 16四. 实验原理与方法 16五. 实验内容与步骤 17实验三、图像的空间域平滑和锐化 22一. 实验目的 22二. 实验内容和要求 22三. 实验主要仪器设备和材料 22四. 实验原理 22五. 实验设计步骤 24实验一 VC图像编程基础实验项目名称:VC图像编程基础实验项目性质:验证性实验所属课程名称:数字图像处理实验计划学时:2一. 实验目的(1) 学习使用vc图像处理的

4、基本知识。(2) 了解BMP位图格式。(3) 掌握利用VC+建立单文档工程。(4) 掌握使用CDIB类。(5) 掌握添加菜单项和响应函数。二. 实验内容和要求在VC+6.0环境下编程利用CDIB类实现对位图的读取和显示操作。 三. 实验主要仪器设备和材料计算机,VC6.0四. 实验原理及方法1、位图格式计算机中位图文件由三部分组成,分别是:文件头、位图信息和位图像素数据(如图1.1)。文件头位图信息(信息头颜色信息表)图像数据图1.1、Bmp位图文件的组成11 位图文件头 位图文件头主要用于识别位图文件。以下是位图文件头结构的定义: typedef struct tagBITMAPFILEHE

5、ADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER;其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。12 位图信息结构位图信息结构中所记录的值用于分配内存,设置调色板信息,读取像素值等。以下是位图信息结构的定义: typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /信息头 RGBQUAD bmiColors1; /颜色表

6、BITMAPINFO;可见位图信息也是由两部分组成的:位图信息头 + 颜色表121 位图信息头位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义: typedef struct tagBITMAPINFOHEADER DWORD biSize; /结构BITMAPINFOHEADER的字节数,即/sizeof(BITMAPINFOHEADER)* LONG biWidth; /以像素为单位的图像宽度* LONG biHeight; /以像素为单位的图像长度 WORD biPlanes; /目标设备的位

7、平面数 WORD biBitCount /每个像素的位数*(1) DWORD biCompression; /图像的压缩格式(这个值几乎总是为0) DWORD biSizeImage; /以字节为单位的图像数据的大小(对/BI_RGB压缩方式而言) LONG biXPelsPerMeter; /水平方向上的每米的像素个数 LONG biYPelsPerMeter; /垂直方向上的每米的像素个数 DWORD biClrUsed; /调色板中实际使用的颜色数(2) DWORD biClrImportant; /现实位图时必须的颜色数(3) BITMAPINFOHEADER; 说明:(1)、*是需要

8、加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量。(2)、biBitCount:对于每个像素的字节数,分别有以下意义:0,用在JPEG格式中1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片4,16色图8,256色图,通常说的灰度图16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式(3)、biClrUsed:这个值通常为

9、0,表示使用biBitCount确定的全部颜色,例外是使用的颜色数目小于制定的颜色深度的颜色数目的最大值。(4)、biClrImportant:这个值通常为0,表示所有的颜色都是必需的。122 颜色表 颜色表一般是针对16位以下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位以下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。图1.2是带调色板和不带调色板的位图的简单示意图: a. 带调色板的位图 b. 不带调色板的

10、位图图1.2 不同的位图结构颜色表是由颜色表项组成的,颜色表项结构的定义如下:typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD;其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。 123位图数据最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占

11、1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=16时,1个像素占2个字节(RGB555格式);当biBitCount=24时,1个像素占3个字节(BGR格式);当biBitCount=32时,1个像素占4个字节(BGR-格式,-表示不处理的字节)注意:Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法:DataSizePerLine= (biWidth* biBitCount+31)/8; / 一个扫描行所占的字节数每行的字节数必须是

12、4的倍数。DataSizePerLineDataSizePerLine/4*4; 位图数据的大小(不压缩情况下):DataSize= DataSizePerLine* biHeight; 2、CDIB类 该类将位图文件的读取、象素数据的获取及显示进行了封装。具体的代码见附带的电子参考资料。下面介绍具体的成员和方法:1、bool CDIB:LoadFromFile(LPCTSTR lpszFileName)功能:用于加载位图。参数:lpszFileName表示加载的位图路径和名称。如:d:test123.bmp返回值:成功读取后,返回true,否则为false注意:但调用该函数成功加载位图后,C

13、DIB类的成员变量m_bLoaded将变为true,否则为false,因此,可以通过m_bLoaded来进行判断是否加载了位图。2、int GetDIBWidth()功能:获取位图的宽度返回值:位图的宽度注意:该函数只有在加载位图后才能调用,否则会出错(可通过m_bLoaded来判断)。3、int GetDIBHeight()功能:获取位图的高度返回值:位图的高度注意:该函数只有在加载位图后才能调用,否则会出错(可通过m_bLoaded来判断)。4、void CDIB:ShowDIB(CDC *pDC, int nLeft, int nTop, int nRight, int nBottom,

14、 BYTE *pDIBData, BITMAPINFO* pBMI)功能:显示位图参数:pDC /DC的句柄nLeft, /目标矩形左上角的X坐标nTop, /目标矩形左上角的Y坐标nRight, /目标矩形的宽度nBottom, /目标矩形的高度0, /源矩形左上角的X坐标0, /源矩形左上角的Y坐标GetDIBWidth(), /源矩形的宽度GetDIBHeight(), /源矩形的高度pDIBData, /位图图象数据的地址 pBMI, /位图信息结构地址5、InvalidateData()功能:将m_pdata 的信息赋值给m_pDIBData,便于显示m_pdata的信息。 6、几个

15、重要的成员变量BYTE *m_pdata; /位图的灰度信息bool m_bLoaded; /表示是否加载了位图BITMAPINFO* m_pBMI; /位图信息头BYTE* m_pDIBData; /位图象素数据指针BYTE* m_pDumpDIBData; /位图象素数据指针BITMAPFILEHEADER bfh; /位图信息头BITMAPINFOHEADER bih; / 位图文件头注意:m_pdata与m_pDIBData的关系 如果是8位图,m_pdata与m_pDIBData两个指针指向的数据块内容是相等的,即:m_pdatak=m_pDIBDatak 如果是24位图,m_pda

16、ta与m_pDIBData两个指针指向的数据块内容是不相等的,m_pDIBData代表的是象素的RGB格式,而m_pdata表示的是象素的灰度信息。其关系为:m_pdatani*nW+nj=(unsigned char)(m_pDIBDatani*(3*nW+length)+3*nj*0.11+m_pDIBDatani*(3*nW+length)+3*nj+1*0.59+m_pDIBDatani*(3*nW+length)+3*nj+2*0.3);具体见CDIB类代码。当为24位图时,显示时采用m_pDIBData数据,为简单起见,我们可以仅仅对灰度信息进行处理,因为在灰度信息m_pdata数

17、据中,一个象素对应于一个字节,而彩色信息m_pDIBData数据中,一个象素对于于三个字节。如果对m_pdata进行处理后,我们可以通过调用InvalidateData()函数来将m_pdata的数据赋值给m_pDIBData,从而显示处理结果。五. 实验步骤: 1、建立当文档工程。 步骤一:建立工程进入vc集成开发环境,单击File菜单下的new,出现一个对话框,在对话框中选择Project项目,选中MFC AppWinzid (exe),并填写好项目名称,存储路径,点击OK.进入下一步,在出现的页面中选择当文档模式(Single document),单击完成(Finish),即可。步骤二:

18、编译工程 单击Build菜单下的Execute test.exe(或单击工具栏中的 ! )编译一下刚才建立的项目。即可看到一个如下图1.3的windows 风格窗口。图1.32、添加CDIB类步骤一:将dib.cpp和dib.h文件(已发给大家)拷贝到工程目录下。步骤二:打开工程空间(双击刚才建立的目录下的test.dsw) 。单击在编译窗口中的ProjectAdd To ProjectFiles,在弹出的对话框中选择dib.cpp和dib.h。单击确定。步骤三:在类视图中查看是否有CDIB类(如下图1.4),如果没有请重复步骤一。 图1.43、建立菜单项步骤一、点击ResouceView。双

19、击资源中的MEUMIDC_MAINFRAME。在编辑框中将看到主框架的菜单资源(如图.5).如图1.5步骤二、在菜单资源中,添加菜单栏和菜单项。双击其中的一个空白菜单栏,即进入其熟悉框,可添加或修改其名称,这里将其命名为(图像操作),如图1.6. 图1.6步骤三、在“图像操作栏”中添加菜单项“打开图像”。具体步骤见图1.7。 步骤四、编译(单击!),将出现如图1.8的界面,如果没有出现菜单栏和菜单项,请重复到步骤一。 图1.84、添加CTestView的公共成员函数m_dib 按照如图1.9中的提示操作,添加CTestView的公共成员函数m_dib. 图1.95、添加响应函数步骤一、右击编辑

20、框中的任意位置,在弹出的提示菜单中,选择ClassWizard,在弹出的类向导对话框中,按照如图1.10的提示进行选择和操作。 图1.10步骤二、查看类视图中的CTestView类中是否有OnOpenImage函数,正确的如图1.11,单击该函数即进入该函数体。 图1.116、实现响应函数的功能 在ClassView中CTestView类中的OnOpenImage函数,进入其函数体。添加如下红色字体代码:void CTestView:OnOpenIamge() / TODO: Add your command handler code here static char szFilter=BMP

21、文件(*.bmp)|*.bmp|; /定义过滤文件的类型 CFileDialog dlg(TRUE,bmp,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);/定义文件对话框对象 CString filename;int ret=dlg.DoModal(); /运行打开文件对方框 if(ret=IDOK) filename=dlg.GetFileName(); /获取所选择图像的路径 m_dib.LoadFromFile(filename); /加载图像 if(!m_dib.m_bLoaded) /判断是否加载图像成功 AfxMessag

22、eBox(图像打不开); return; Invalidate(1); /刷新屏幕7、添加显示代码 在ClassView中CTestView类中的OnDraw函数,进入其函数体。添加如下红色字体代码:void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here if(m_dib.m_bLoaded=true) /判断是否加载图像 /获取图像宽和高int nw=m_dib.GetDIBWidth();int

23、 nh=m_dib.GetDIBHeight();/ 显示图像(具体的参数见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);8、编译运行点击(!)编译运行刚才的代码,如果没有出错则可单击“图像操作”“打开图像”,选择图像打开,显示(结果如图1.12),有错则对图从第一部分重新新一步一步调试。 图1.12实验二 一个简单的图像处理工程实例实验项目名称:一个简单的图像处理

24、工程实例实验项目性质:综合性实验所属课程名称:数字图像处理实验计划学时:3六. 实验目的(1) 掌握图像处理工程的流程。(2) 掌握图像点运算。(3) 理解图像处理功能函数的编写。(4) 了解对CDIB类中各成员函数和变量的功能。七. 实验内容和要求在实验一的工程中实现图像二值化和底片效果。八. 实验主要仪器设备和材料计算机,VC6.0九. 实验原理与方法1、 图像的二值化的基本原理图像的二值化处理图像分割中的一个主要内容,就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。用I表示原图,R表示二值化后的图,则二值化的过程可以用以下公式表示: thr表示选取的阈值。二值

25、化的过程就是当原图的象素灰度值大于阈值就将其变白,否则就将其变黑。即将256个亮度等级的灰度图像通过适当的阀值选而将图像变为二个级别灰度级,这样只有二个灰度级的图像在图像处理分析过程中占有非常重要的地位,特别是在实用的图像处理中。以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较

26、的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。根据对全图使用统一阈值还是对不同区域使用不同阈值,可以分为全局阈值方法(global thresholding)和局部阈值方法(local thresholding,也叫做自适应阈值方法adaptive thresholding);这种与坐标相关的阈值也叫动态阈值,此方法也叫变化阈值法,或自适应阈值法。具体的方法,可以参考相关的图像处理书籍。本实验采用固定全局阈值方法,即在整个图像中所有的象素点,其阈

27、值thr相同。2、底片效果原理大家对照片的底片一定都很熟悉了,底片上的颜色与色彩鲜艳的照片的颜色是正好相反的,即反色。 编程原理:各种色彩都是由红、绿、蓝三种颜色按不同的比例混合而成的,这就是我们所说的三基色,它们的颜色值(RGB值)是 0255 ,我们只需用255减去各个点的R、G、B各基色值,然后用255减去这个值,并将这个值重新赋值给各个点,就会达到我们想要的底片效果了。 3、实验中图像处理的一步流程: 获取数据(打开图像,得到图像信息)处理数据(采用相应的算法对图像数据进行处理)返回结果(显示图像)一十. 实验内容与步骤1、 图像的底片化操作步骤一、打开实验一建立的test工程空间(双

28、击test.dsw)。步骤二、按照实验一介绍的方法建立在“图像操作”菜单栏中新建菜单项“底片化”。步骤三、按照实验一介绍的方法建立菜单项“底片化”的响应函数Negative()。步骤四、打开响应函数Negative(),将下来红色字体代码拷贝到Negative()中,注意:请分析每行代码的意思。void CTestView:OnNegative() / TODO: Add your command handler code here / /功能:实现底片化 / /判断图像是否打开,没打开,则弹出提示框并退出函数 if(!m_dib.m_bLoaded) AfxMessageBox(图像还打开,

29、请先打开图像!); return; /获取图像宽和高 int nw=m_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); int i,j; / 定义阈值并赋值为100; /对每一个象素进行底片化处理 for(j=0;jnh;j+) for(i=0;inw;i+) /对图像的第j行、第i列的象素的灰度信息进行判断,修改 int gray=m_dib.m_pdataj*nw+i; m_dib.m_pdataj*nw+i=255-gray; /将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData();

30、 /刷新屏幕 Invalidate();步骤五、点击(!),编译运行,打开一幅24位bmp图,然后再单击“二值化”,观察效果。如图2.1示。 图2.12、 图像的二值化操作步骤一、打开实验一建立的test工程空间(双击test.dsw)。步骤二、按照实验一介绍的方法建立在“图像操作”菜单栏中新建菜单项“二值化”。步骤三、按照实验一介绍的方法建立菜单项“二值化”的响应函数Binary()。步骤四、打开响应函数Binary(),将下来红色字体代码拷贝到Binary()中,注意:请分析个行代码的意思。void CTestView:OnBinary() / TODO: Add your command handler code here /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1