logo资料库

vc++数字图像处理编程(完整版).pdf

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
VC数字图像处理编程讲座之一
VC数字图像处理编程讲座之二
VC数字图像处理编程讲座之三
VC数字图像处理编程讲座之四
VC数字图像处理编程讲座之五
VCVCVCVC 数字图像处理编程讲座之一 前 言 数字图像处理技术与理论是计算机应用的一个重要领域,许多工 程应用都涉及到图像处理,一直有一个强烈的愿望,想系统的写一个 关于数字图像处理的讲座,由于工作学习很忙,时至今日才得以实现。 “图”是物体透射光或反射光的分布,“像”是人的视觉系统对图的接收 在大脑中形成的印象或认识。图像是两者的结合。人类获取外界信息 是靠听觉、视觉、触觉、嗅觉、味觉等,但绝大部分(约 80%左右) 来自视觉所接收的图像信息。图像处理就是对图像信息进行加工处 理,以满足人的视觉心理和实际应用的需要。简单的说,依靠计算机 对图像进行各种目的的处理我们就称之为数字图像处理。早期的数字 图像处理的目的是以人为对象,为了满足人的视觉效果而改善图像的 质量,处理过程中输入的是质量差的图像,输出的是质量好的图像, 常用的图像处理方法有图像增强、复原等。随着计算机技术的发展, 有一类图像处理是以机器为对象,处理的目的是使机器能够自动识别 目标,这称之为图像的识别,因为这其中要牵涉到一些复杂的模式识 别的理论,所以我们后续的讲座只讨论其中最基本的内容。由于在许 多实际应用的编程中往往都要涉及到数字图像处理,涉及到其中的一 些算法,这也是许多编程爱好者感兴趣的一个内容,我们这个讲座就
是讨论如何利用微软的 Visual C++开发工具来实现一些常用的数字 图像处理算法,论述了图像处理的理论,同时给出了 VC 实现的源代 码。本讲座主要的内容分为基础篇、中级篇和高级篇,具体包含的主 要内容有: 1. 图像文件的格式; 2. 图像编程的基础-操作调色板; 3. 图像数据的读取、存储和显示、如何获取图像的尺寸等; 4. 利用图像来美化界面; 5. 图像的基本操作:图像移动、图像旋转、图像镜像、图像的 缩放、图像的剪切板操作; 6. 图像显示的各种特技效果; 7. 图像的基本处理:图像的二值化、图像的亮度和对比度的调 整、图像的边缘增强、如何得到图像的直方图、图像直方图的修正、 图像的平滑、图像的锐化等、图像的伪彩色、彩色图像转换为黑白图 像、物体边缘的搜索等等;
8. 二值图像的处理:腐蚀、膨胀、细化、距离变换等; 9. 图像分析:直线、圆、特定物体的识别; 10.JEPG、GIF、PCX 等格式文件相关操作; 11.图像文件格式的转换; 12.图像的常用变换:付利叶变换、DCT 变换、沃尔什变换等; 13.AVI 视频流的操作; 图像处理技术博大精深,不仅需要有很强的数学功底,还需要熟 练掌握一门计算机语言,在当前流行的语言中,我个人觉的 Visual C++这个开发平台是图像开发人员的首选工具。本讲座只是起到抛砖 引玉的作用,希望和广大读者共同交流 VCVCVCVC 数字图像处理编程讲座之二 第一节 图像的文件格式
要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的 认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进 行处理以前,首先要数字化,比如摄像头(CCD)摄取的信号在送往计算机处 理前,一般情况下要经过数模转换,这个任务常常由图像采集卡完成,它的输出 一般为裸图的形式;如果用户想要生成目标图像文件,必须根据文件的格式做相 应的处理。随着科技的发展,数码像机、数码摄像机已经进入寻常百姓家,我们 可以利用这些设备作为图像处理系统的输入设备来为后续的图像处理提供信息 源。无论是什么设备,它总是提供按一定的图像文件格式来提供信息,比较常用 的有 BMP 格式、JPEG 格式、GIF 格式等等,所以我们在进行图像处理以前, 首先要对图像的格式要有清晰的认识,只有在此基础上才可以进行进一步的开发 处理。 在讲述图像文件格式前,先对图像作一个简单的分类。除了最简单的图像外,所 有的图像都有颜色,而单色图像则是带有颜色的图像中比较简单的格式,它一般 由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0” 表示白色,当然也可以倒过来表示,这种图像称之为二值图像。我们也可以用 8 个比特(一个字节)表示一个像素,相当于把黑和白等分为 256 个级别,“0”表 示为黑,“255”表示为白,该字节的数值表示相应像素值的灰度值或亮度值,数 值越接近“0”,对应像素点越黑,相反,则对应像素点越白,此种图像我们一般 称之为灰度图像。单色图像和灰度图像又统称为黑白图像,与之对应存在着彩色 图像,这种图像要复杂一些,表示图像时,常用的图像彩色模式有 RGB 模式、 CMYK 模式和 HIS 模式,一般情况下我们只使用 RGB 模式,R 对应红色,G 对 应绿色,B 对应蓝色,它们统称为三基色,这三中色彩的不同搭配,就可以搭配 成各种现实中的色彩,此时彩色图像的每一个像素都需要 3 个样本组成的一组数 据表示,其中每个样本用于表示该像素的一个基本颜色。 对于现存的所有的图像文件格式,我们在这里主要介绍 BMP 图像文件格式, 并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各 个像素进行相应的处理,而未压缩的 BMP 图像中的像素数值正好与实际要处理
的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。请读者记 住,压缩过的图像是无法直接进行数字化处理的,如 JPEG、GIF 等格式的文件, 此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。后续章 节中我们将针对特殊的文件格式如何转换为 BMP 格式的文件问题作专门的论 述,经过转换,我们就可以利用得到的未压缩的 BMP 文件格式进行后续处理。 对于 JPEG、GIF 等格式,由于涉及到压缩算法,这要求读者掌握一定的信息论 方面的知识,如果展开的话,可以写一本书,限于篇幅原因,我们只作一般性的 讲解,有兴趣的朋友可以参考相关书籍资料。 一、BMP 文件结构 1. BMP 文件组成 BMP 文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件 头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信 息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、 图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用 到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用 24 个 比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据 块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序 为从左到右,从下到上,也就是说,在 BMP 文件中首先存放的是图像的最后一 行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边 后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的 每一行像素值时,如果存储该行像素值所占的字节数为 4 的倍数,则正常存储, 否则,需要在后端补 0,凑足 4 的倍数。 2. BMP 文件头
BMP 文件头数据结构含有 BMP 文件的类型、文件大小和位图起始位置等信 息。其结构定义如下: typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为“BM” DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 位图文件保留字,必须为 0 WORD bfReserved2; // 位图文件保留字,必须为 0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示, 以字节为单位 } BITMAPFILEHEADER;该结构占据 14 个字节。 3. 位图信息头 BMP 位图信息头数据用于说明位图的尺寸等信息。其结构如下: typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数 LONG biWidth; // 位图的宽度,以像素为单位 LONG biHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的平面数不清,必须为 1 WORD biBitCount// 每个像素所需的位数,必须是 1(双色), 4(16 色),8(256 色) 或 24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8 压缩类 型)或 2(BI_RLE4 压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数 LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER;该结构占据 40 个字节。 注意:对于 BMP 文件格式,在处理单色图像和真彩色图像的时候,无论图 象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采 用压缩格式,那么 16 色图像采用 RLE4 压缩算法,256 色图像采用 RLE8 压缩算 法。 4. 颜色表 颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个 RGBQUAD 类型的结构,定义一种颜色。RGBQUAD 结构的定义如下: typedef struct tagRGBQUAD { BYTErgbBlue;// 蓝色的亮度(值范围为 0-255) BYTErgbGreen; // 绿色的亮度(值范围为 0-255) BYTErgbRed; // 红色的亮度(值范围为 0-255) BYTErgbReserved;// 保留,必须为 0 } RGBQUAD; 颜色表中 RGBQUAD 结构数据的个数由 BITMAPINFOHEADER 中的 biBitCount 项来确定,当 biBitCount=1,4,8 时,分别有 2,16,256 个颜色表项,当 biBitCount=24 时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分 别对应 R、G、B 值,图像文件没有颜色表项。位图信息头和颜色表组成位图信 息,BITMAPINFO 结构定义如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 颜色表 } BITMAPINFO;
注意:RGBQUAD 数据结构中,增加了一个保留字段 rgbReserved,它不代 表任何颜色,必须取固定的值为“0”,同时,RGBQUAD 结构中定义的颜色值中, 红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相 反,既:若某个位图中的一个像素点的颜色的描述为“00,00,ff,00”,则表示 该点为红色,而不是蓝色。 5. 位图数据 位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像 记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。这种格式我们又称 为 Bottom_Up 位图,当然与之相对的还有 Up_Down 形式的位图,它的记录顺序 是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像素值所 占的字节数:当 biBitCount=1 时,8 个像素占 1 个字节;当 biBitCount=4 时,2 个像素占 1 个字节;当 biBitCount=8 时,1 个像素占 1 个字节;当 biBitCount=24 时,1 个像素占 3 个字节,此时图像为真彩色图像。当图像不是为真彩色时,图像 文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为 真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对 应 R、G、B 分量的值,这时候图像文件中没有颜色表。上面我已经讲过了, Windows 规定图像文件中一个扫描行所占的字节数必须是 4 的倍数(即以字为单 位),不足的以 0 填充,图像文件中一个扫描行所占的字节数计算方法: DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数 位图数据的大小按下式计算(不压缩情况下): DataSize= DataSizePerLine* biHeight。 上述是 BMP 文件格式的说明,搞清楚了以上的结构,就可以正确的操作图 像文件,对它进行读或写操作了。
分享到:
收藏