vc++数字图像处理实验指导书.doc
《vc++数字图像处理实验指导书.doc》由会员分享,可在线阅读,更多相关《vc++数字图像处理实验指导书.doc(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数 字 图像 处 理实验指导书曹江中、何家峰广东工业大学信息工程学院二九年一月前言数字图像处理是信息工程专业一门重要的专业课程。随着图像处理技术的迅速发展和在当今社会中的广泛应用,给数字图像处理课程的教学提出了新的更高的要求。数字图像处理也是一门实践性较强的课程,实验占有重要地位。本实验指导书在分析学生专业特点和知识结构的基础上,选择VC作为编程工具,通过几个主要的图像处理知识点作为实验内容,旨在让学生在较短的实验时间内熟悉数字图像处理实际工程的基本框架、流程,使学生在理论课程学习的同时直接接触、掌握所学知识点的应用,达到培养学生的编程实践能力和学以致用能力的目的。通过对本指导书的使用,为该门
2、课程的课程设计打下良好的基础。本指导书的内容包括:位图格式、VC图像编程基础、基于VC的图像工程实例以及图像的基本处理,如平滑、锐化、区域增强等算法设计等。共8个学时。在数字图像处理的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。(2)学生应认真并且独立完成相应实验内容。(3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。对需编程的实验,写出程序设计说明,给出源程序框图和清单。(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。目录前言I目录II实验一 VC图像编程基础1一.实验目的1二.实验内容和
3、要求1三.实验主要仪器设备和材料1四.实验原理及方法1实验二 一个简单的图像处理工程实例16一.实验目的16二.实验内容和要求16三.实验主要仪器设备和材料16四.实验原理与方法16五.实验内容与步骤17实验三、图像的空间域平滑和锐化22一.实验目的22二.实验内容和要求22三.实验主要仪器设备和材料22四.实验原理22五.实验设计步骤24实验一 VC图像编程基础实验项目名称:VC图像编程基础实验项目性质:验证性实验所属课程名称:数字图像处理实验计划学时:2一. 实验目的(1) 学习使用vc图像处理的基本知识。(2) 了解BMP位图格式。(3) 掌握利用VC+建立单文档工程。(4) 掌握使用C
4、DIB类。(5) 掌握添加菜单项和响应函数。二. 实验内容和要求在VC+6.0环境下编程利用CDIB类实现对位图的读取和显示操作。 三. 实验主要仪器设备和材料计算机,VC6.0四. 实验原理及方法1、位图格式计算机中位图文件由三部分组成,分别是:文件头、位图信息和位图像素数据(如图1.1)。文件头位图信息(信息头颜色信息表)图像数据图1.1、Bmp位图文件的组成11 位图文件头 位图文件头主要用于识别位图文件。以下是位图文件头结构的定义: typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved
5、1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER;其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。12 位图信息结构位图信息结构中所记录的值用于分配内存,设置调色板信息,读取像素值等。以下是位图信息结构的定义: typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /信息头 RGBQUAD bmiColors1; /颜色表 BITMAPINFO;可见位图信息也是由两部分组成的:位图信息头 + 颜色表121 位图信息头
6、位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义: typedef struct tagBITMAPINFOHEADER DWORD biSize; /结构BITMAPINFOHEADER的字节数,即/sizeof(BITMAPINFOHEADER)* LONG biWidth; /以像素为单位的图像宽度* LONG biHeight; /以像素为单位的图像长度 WORD biPlanes; /目标设备的位平面数 WORD biBitCount /每个像素的位数*(1) DWORD biCompre
7、ssion; /图像的压缩格式(这个值几乎总是为0) DWORD biSizeImage; /以字节为单位的图像数据的大小(对/BI_RGB压缩方式而言) LONG biXPelsPerMeter; /水平方向上的每米的像素个数 LONG biYPelsPerMeter; /垂直方向上的每米的像素个数 DWORD biClrUsed; /调色板中实际使用的颜色数(2) DWORD biClrImportant; /现实位图时必须的颜色数(3) BITMAPINFOHEADER; 说明:(1)、*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量。(2)、biBitCount:对
8、于每个像素的字节数,分别有以下意义:0,用在JPEG格式中1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片4,16色图8,256色图,通常说的灰度图16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式(3)、biClrUsed:这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色数目小于制定的颜色深度的颜色数
9、目的最大值。(4)、biClrImportant:这个值通常为0,表示所有的颜色都是必需的。122 颜色表 颜色表一般是针对16位以下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位以下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。图1.2是带调色板和不带调色板的位图的简单示意图: a. 带调色板的位图 b. 不带调色板的位图图1.2 不同的位图结构颜色表是由颜色表项组成的,颜色表项结构的定义如下:typedef
10、struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD;其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。 123位图数据最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个
11、像素占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; / 一个扫描行所占的字节数每行的字节数必须是4的倍数。DataSizePerLineDataSizePerLine/4*4; 位图数据的大
12、小(不压缩情况下):DataSize= DataSizePerLine* biHeight; 2、CDIB类 该类将位图文件的读取、象素数据的获取及显示进行了封装。具体的代码见附带的电子参考资料。下面介绍具体的成员和方法:1、bool CDIB:LoadFromFile(LPCTSTR lpszFileName)功能:用于加载位图。参数:lpszFileName表示加载的位图路径和名称。如:d:test123.bmp返回值:成功读取后,返回true,否则为false注意:但调用该函数成功加载位图后,CDIB类的成员变量m_bLoaded将变为true,否则为false,因此,可以通过m_bLo
13、aded来进行判断是否加载了位图。2、int GetDIBWidth()功能:获取位图的宽度返回值:位图的宽度注意:该函数只有在加载位图后才能调用,否则会出错(可通过m_bLoaded来判断)。3、int GetDIBHeight()功能:获取位图的高度返回值:位图的高度注意:该函数只有在加载位图后才能调用,否则会出错(可通过m_bLoaded来判断)。4、void CDIB:ShowDIB(CDC *pDC, int nLeft, int nTop, int nRight, int nBottom, BYTE *pDIBData,BITMAPINFO* pBMI)功能:显示位图参数:pDC
14、/DC的句柄nLeft, /目标矩形左上角的X坐标nTop, /目标矩形左上角的Y坐标nRight, /目标矩形的宽度nBottom, /目标矩形的高度0, /源矩形左上角的X坐标0, /源矩形左上角的Y坐标GetDIBWidth(), /源矩形的宽度GetDIBHeight(), /源矩形的高度pDIBData, /位图图象数据的地址 pBMI, /位图信息结构地址5、InvalidateData()功能:将m_pdata 的信息赋值给m_pDIBData,便于显示m_pdata的信息。 6、几个重要的成员变量BYTE *m_pdata; /位图的灰度信息bool m_bLoaded; /表
15、示是否加载了位图BITMAPINFO * m_pBMI; /位图信息头BYTE* m_pDIBData; /位图象素数据指针BYTE* m_pDumpDIBData; /位图象素数据指针BITMAPFILEHEADER bfh; /位图信息头BITMAPINFOHEADER bih; / 位图文件头注意:m_pdata与m_pDIBData的关系n 如果是8位图,m_pdata与m_pDIBData两个指针指向的数据块内容是相等的,即:m_pdatak=m_pDIBDatakn 如果是24位图,m_pdata与m_pDIBData两个指针指向的数据块内容是不相等的,m_pDIBData代表的是
16、象素的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数据中,一个象素对应于一个字节,而彩色信息m_pDIBData数据中,一个象素对于于三个字节
17、。如果对m_pdata进行处理后,我们可以通过调用InvalidateData()函数来将m_pdata的数据赋值给m_pDIBData,从而显示处理结果。五. 实验步骤: 1、建立当文档工程。 步骤一:建立工程进入vc集成开发环境,单击File菜单下的new,出现一个对话框,在对话框中选择Project项目,选中MFC AppWinzid (exe),并填写好项目名称,存储路径,点击OK.进入下一步,在出现的页面中选择当文档模式(Single document),单击完成(Finish),即可。步骤二:编译工程 单击Build菜单下的Execute test.exe(或单击工具栏中的 ! )
18、编译一下刚才建立的项目。即可看到一个如下图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。双击资源中的MEUMIDC_MAINFRAME。在编辑框中将看到主框架的菜单资源(如图.5)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 数字图像 处理 实验 指导书
限制150内