1、东华理工大学本科毕业设计数字图像的几何变换摘 要几何变换是最常见的图像处理手段,通过对变形的图像进行几何校正,可以得出准确的图像。常用的几何变换功能包括图像的平移、图像的镜像变换、图像的转置、图像的缩放、图像的旋转等等。目前数字图像处理的应用越来越广泛,已经渗透到工业、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。作为数字图像处理的一个重要部分,本文介绍的工作是如何用Visual C+编程工具设计一个完整的应用程序,实现经典的图像几何变换功能。程序大概分为两大部分:读写BMP图像,和数字图像的几何变换。即首先用Visual C+创建一个多文档应用程序框架,在实现任意BMP图像的读写
2、,打印,以及剪贴板操作的基础上,完成经典的图像几何变换功能。图像几何变换的Visual C+编程实现,为校内课题的实现提供了一个实例。关键字:图像处理;几何变换;BMP图像;Visual C+ - 2 -AbstractThe geometrical transformation is the most popular image processing method. We can get an exact image from a distorted image through the geometrical emendation. The transforming methods in c
3、ommon use including translation, mirror, rotation, or transpose an image. Since the domain of digital image processing application has becoming wider and wider, it penetrates into many fields. Such as industry, aviation, military, and has become much more important in every aspects of our life.Being
4、 an important part of digital image processing, the work introduced in this article is about how to design an integrated application program using Visual C+ to implement the classic geometrical transformation. The program can be divided into two parts: read or write a BMP image, and the geometrical
5、transformation for it. So I designed a multiple document interface first, on the basic of read, write, print, and the clipboard operation of an image, then carry out the function of geometrical transformation finally. The implementation of geometrical transformation using Visual C+ is a good example
6、 for carrying out intramural problems.Keywords: Image processing; Geometrical transformation; BMP image; Visual C+ 目 录第一章 绪论111 何谓数字图像处理1111 图像的概念1112图像处理112 图像处理学的内容和其他相关学科的关系2121 图像处理学的内容2122 图像处理学与相关学科的关系213 数字图像处理的特点及其应用2131 数字图像处理的特点2132 数字图像处理的应用314 Visual C+4141 Visual C+简述4142 将Visual C+应用于数
7、字图像的几何变换4第二章 数字图像处理的基本概念521 图像和调色板5211 图像的显示5212 调色板5213 色彩系统6214 灰度图722 GDI位图7221 从资源中装入GDI位图8222 伸缩位图823 设备无关位图(DIB)8231 BMP文件中DIB的结构9232 DIB访问函数11233 使用DIB读写BMP文件12第三章 图像的几何变换1431 图像的平移14311 理论基础14312 Visual C+编程实现1532 图像的镜像变换19321 理论基础19322 Visual C+编程实现2033 图像的转置23331 理论基础23332 Visual C+编程实现243
8、4 图像的缩放26341 理论基础26342 Visual C+编程实现2735 图像的旋转30351 理论基础31352 Visual C+编程实现3136 本程序基本类对象之间的相互访问关系35第四章 结论与展望3741 结论3742 展望37致谢39参考文献40第一章 绪论11 何谓数字图像处理数字图像处理(Digital Image Processing),就是利用数字计算机或则其他数字硬件,对从图像信息转换而得到的电信号进行某些数学运算,以提高图像的实用性。例如从卫星图片中提取目标物的特征参数,三维立体断层图像的重建等。总的来说,数字图像处理包括点运算、几何处理、图像增强、图像复原、
9、图像形态学处理、图像编码、图像重建、模式识别等。目前数字图像处理的应用越来越广泛,已经渗透到工业、医疗保健、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。111 图像的概念图像是对客观对象的一种相似性的、生动性的描述或写真。或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。它是人们最主要的信息来源。据统计,一个人获取的信息大约有75%来自视觉。图像根据其形式或产生方法来分类。从人眼的视觉特点上可将图像分为可见图像和不可见图像。其中可见图像的一个子集为图片,它包括照片、用线条画的图和画;另一个子集为光图像,即用透镜、光栅和全息技术产生的图像。不可见的图像包括不可见光成像和
10、不可见量,如温度、压力及人口密度等的分布图。按波段多少图像可分为但波段、多波段和超波段图像。但波段图像上每点只有一个亮度值;多波段图像上每点不只一个特性。例如红、绿、蓝三波段光谱图像或彩色图像上的每个点具有红、绿、蓝三个亮度值,这三个值表示在不同光波段上的强度,人眼看来就是不同的颜色。超波段图像上每个点具有几十或几百个特性。按图像空间坐标和明暗程度的连续性可分为模拟图像和数字图像。模拟图像指空间坐标和明暗程度都是连续变化的、计算机无法直接处理的图像。数字图像是一种空间坐标和灰度均不连续的、用离散的数字(一般用整数)表示的图像。这样的图像才能被计算机处理。112图像处理对图像进行一系列的操作,以
11、达到预期的目的的技术称作图像处理。图像处理可分为模拟图像处理和数字图像处理两种方式。利用光学、照像和电子学方法对模拟图像的处理称为模拟图像处理。光学图像处理方法已有很长的历史,在激光全息技术出现后,它得到了进一步的发展。尽管光学图像处理理论日臻完善,且处理速度快,信息容量大,分辨率高,又非常经济,但处理精度不高,稳定性差,设备笨重,操作不方便和工艺水平不高等原因限制了它的发展速度。从20世纪60年代起,随着电子计算机技术的进步,计算机图像处理获得了飞跃发展。所谓数字图像处理,就是利用计算机对数字图像进行系列操作,从而获得某种预期的结果的技术。数字图像处理离不开计算机,因此又称计算机图像处理。为
12、了与模拟图像处理想区别,下文采用“数字图像处理”。12 图像处理学的内容和其他相关学科的关系121 图像处理学的内容至20世纪70年代末以来,由于数字技术和微电子技术的迅猛发展给数字图像处理提供了先进的技术手段,基于计算机的图像处理学也就从信息处理、自动控制系统论、计算机科学、数据通信、电视技术等学科中脱颖而出,成为研究“图像信息的获取、传输、存储、变换、显示、理解与综合利用”的一门崭新学科。图像处理学所包含的内容是相当丰富的,根据抽象程度的不同可分为三个层次:狭义图像处理、图像分析和图像理解。狭义图像处理着重强调在图像之间进行的变换,主要是指对图像进行各种操作以改善图像的视觉效果,或对图像进
13、行压缩编码以减少所需存储空间或传输时间、传输通路的要求。它是一个从图像到图像的过程。图像分析主要是对图像中感兴趣的目标进行检测和测量,从而建立对图像的描述。图像分析是一个从图像到数值或符号的过程。图像理解超出了目前的所学范围,则不加以讨论。122 图像处理学与相关学科的关系图像处理学是一门综合性边缘学科。从研究范围来看,它与计算机图形学、模式识别、计算机视觉等既有联系又有区别。图形学原本指用图形、图表、绘图等形式表达数据信息的科学。而计算机图形学研究的是如何利用计算机技术来产生这些形式。和图像分析对比,两者的处理对象和输出结果正好相反。计算机图形学试图从非图像形式的数据描述来生成图像。另一方面
14、,模式识别与图像分析则比较相似,只是前者试图把图像抽象成符号描述的类别,它们有相同的输入,而不同的输出结果之间可较方便的进行转换。至于计算机视觉主要强调用计算机去实现人的视觉功能,其中涉及图像处理的许多技术,但目前的研究内容主要与图像理解相结合。由此看来,以上学科相互联系,相互交叉,它们之间并没有绝对的界限。虽各有侧重但又相互补充。另外以上各学科都得到了人工智能、神经网络、遗传算法、模糊逻辑等新理论、新工具、新技术的支持,所以它们又都在近年得到了长足发展。13 数字图像处理的特点及其应用在计算机出现之前,模拟图像处理占主导地位。随着计算机的发展,数字图像处理发展速度越来越快。与人类对视觉机能着
15、迷的历史相比,它是一门相对年轻的学科。尽管目前一般采用顺序处理的计算机,对大数据量的图像处理速度不如光学方法快,但是其处理的精度高,实现多种功能的、高度复杂的运算求解非常灵活方便。在其短短的历史中,它却成功的应用于几乎所有与成像有关的领域,并正发挥相当重要的作用。131 数字图像处理的特点同模拟图像处理相比,数字图像处理有很多优点。主要表现在:1 精度高不管是对4bit还是8bit和其他比特图像的处理,对计算机程序来说几乎是一样的。即使处理图像变大,只需改变数组的参数,而处理方法不变。所以从原理上不管处理多高精度的图像都是可能的。而在模拟图像处理中,要想使精度提高一个数量级,就必须对处理装置进
16、行大幅度改进。2 再现性好不管是什么图像,它们均用数组或集合表示。将它们输入到计算机内,用计算机容易处理的方式表示。在传送和复制图像时,只在计算机内部进行处理,这样数据就不会丢失或遭破坏,保持了完好的再现性。而在模拟图像处理中,就会因为各种干扰及设备故障而无法保持图像的再现性。3 通用性、灵活性高不管是可视图像还是X线照片、红外线热成像、超声波图像等不可见光成像,尽管这些图像成像体系中的设备规模和精度各不相同,但当把图像信号直接进行A/D变换,或记录成照片再数字化,对于计算机来说都能用二维数组表示,不管什么样的图像都可以用同样的方法进行处理,这就是计算机处理的通用性。另外,对处理程序自由加以改
17、变,可进行各种各样的处理。如上下滚动、漫游、拼图、合成、变换、放大、缩小和各种逻辑运算等,所以灵活性很高。132 数字图像处理的应用计算机图像处理和计算机、多媒体、智能机器人、专家系统等技术的发展紧密相关。近年来计算机识别、理解图像的技术发展很快,也就是图像处理的目的除了直接供人观看(如医学图像是为医生观看作诊断)外,还进一步发展了与计算机视觉有关的应用,如邮件自动分检,车辆自动驾驶等。下面仅罗列了一些典型应用实例,而实际应用更广。1 在生物医学中的应用主要包括显微图像处理;DNA显示分析;红、白血球分析计数;虫卵及组织切片的分析;癌细胞的识别;染色体分析等等。2 遥感航天中的应用军事侦察、定
18、位、导航、指挥等应用;多光谱卫星图像分析;地形、地图、国土普查;地质、矿藏勘探;天文、太空星体的探测及分析等。3 工业应用CAD 和CAM技术用于模具、零件制造、服装、印染业;零件、产品无损检测,焊缝及内部缺陷检查;交通管制、机场监控;火车车皮识别等。4 军事公安领域中的应用巡航导弹地形识别;指纹自动识别;警戒系统及自动火炮控制;反伪装侦察;手迹、人像、印章的鉴定识别;过期档案文字的复原;集装箱的不开箱检查等。5 其他应用图像的远距离通信;多媒体计算机系统及应用;电视电话;服装试穿显示;理发发型预测显示;电视会议;办公自动化、现场视频管理等。14 Visual C+141 Visual C+简
19、述Visual C+(简称VC)是微软公司提供的基于C/C+的应用程序集成开发工具。VC拥有丰富的功能和大量的扩展库,使用它能有效的创建高性能的Windows应用程序和Web应用程序。VC的优越性主要表现在以下几个方面:1 开发分布式应用。2 开发的应用程序运行效率高、具有健壮性。3 能缩短软件升级周期。4 能够生成多线程应用,而多线程应用对于增加并发响应有实际意义。VC除了提供高效的C/C+编译器外,还提供了大量的可重用类和组件,包括著名的微软基础类库(MFC)和活动模板类库(ATL),因此它是软件开发人员不可多得的开发工具。142 将Visual C+应用于数字图像的几何变换VC丰富的功能
20、和大量的扩展库,类的重用特性以及它对函数库、DLL库的支持能使程序更好的模块化,并且通过向导程序大大简化了库资源的使用和应用程序的开发,正由于VC具有明显的优势,因而我选择了它来作为数字图像几何变换的开发工具。在本程序的开发过程中,VC的核心知识、消息映射机制、对话框控件编程等都得到了生动的体现和灵活的应用。第二章 数字图像处理的基本概念本章将详细介绍Windows下Visual C+数字图像处理的基础知识。主要的内容有:1:Windows位图的结构和调色板的概念;2:GDI位图与设备无关位图的概念;3:如何构造自己的DIB函数库,及如何用Visual C+编程来实现Windows位图的读写。
21、21 图像和调色板211 图像的显示普通的显示器屏幕是由许多的点构成的,这些点称为像素。显示时采用扫描的方式:电子枪每次从左到右扫描一行,为每个像素着色,然后再像这样从上到下扫描整个屏幕,利用人眼的视觉暂留效应就可以显示出一屏完整的图像。为了防止闪烁,每秒要重复上述扫描过程几十次。一般刷新频率大于80Hz时,人眼感受不到屏幕刷新而产生的闪烁,这种显示器被称为位映像设备。所谓位映像,就是指一个二维的像素矩阵,而位图就是采用位映像方法显示和存储的图像。对于彩色图像,它的显示必须从三原色RGB的概念说起。众所周知,自然界中的所有颜色都可以由红绿蓝(R、G、B)3原色组合而成。针对三原色成分的多少,可
22、以人为的将每种颜色分成0到255共256个等级。这样,根据红、绿、蓝各种不同的组合,就能表示出256*256*256(约1600万)种颜色。当一幅图中每个像素被赋予不同的RGB值时,就能呈现出五彩缤纷的颜色了,这就形成了彩色图像。212 调色板如果一幅图像的每个像素都用其RGB分量来表示,那么所有的图像文件都将变的非常庞大,实际上的做法不完全是这样的,可以先来看一个简单的计算。对一幅200*200的16色图像,它共有40 000个像素,如果每一个像素都用R、G、B三个分量表示,则一个像素需要3个字节,这样保存整个图像要用200*200*3即120 000字节。但是如果采用下面的方法,就能省很多
23、字节。对于16色图像,图中最多只有16种颜色,如果采用一个颜色表,表中的每一行记录一种颜色的R、G、B值,这样当表示一个像素的颜色时,只需要指出该颜色是在第几行,即该颜色在颜色表中的索引值便可以。例如,如果表的第0行为255,0,0(红色),那么当某个像素为红色时,只需要标明0即可。通过颜色索引表来表示图像,16种状态可以用4位(bit)表示,所以一个像素要用半个字节。整个图像要用200*200*0.5即20 000字节,在加上颜色表占用3*16=48字节,也不过20 048字节。这样一幅图像整个占用的字节数只是前面的1/6。其实这张RGB表,就是通常所说的调色板(Palette),或颜色查找
24、表LUT(Look Up Table)。不仅仅是Windows位图,其他许多图像文件格式,例如“.pcx”、“.tif”、“.gif”等都用到了调色板。还有一种情况,即真彩色图像(又叫做24位图像)的颜色种类高达256*256*256=16 777 216种,也就是包含上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图像是说它具有显示所有颜色的能力,即可以包含所有的颜色。通常,在表示真彩色图像时,每个像素直接用R、G、B这3个分量字节表示,而不采用调色板技术。原因很简单:如果使用调色板,表示一个像素颜色在调色板中的索引要用24位,这和直接用R、G、B这3个分量表示用的字节数一样,不但没有节
25、省任何空间,还要加上一个256*256*256*3个字节大的调色板。所以真彩色直接用R、G、B这3个分量表示。213 色彩系统前面介绍的RGB色彩系统是最常用的颜色系统,但在其他方面也会用到其他的色彩系统,常见的有:1 CMY色彩系统CMY(Cyan,Megenta,Yellow)色彩系统也是一种常用的表示颜色的方式。计算机屏幕的显示通常用RGB色彩系统,它是通过颜色的相加来产生其他颜色,这种做法通常称为加色合成法。而在印刷工业上则通常用CMY色彩系统,它是通过颜色相减来产生其他颜色的,所以称这种方式为减色合成法。图2.1 RGB与CMY色彩系统关系图2 YIQ色彩系统YIQ色彩系统通常被北美
26、的电视系统所采用,这里Y不是指黄色,而是指颜色的明视度,即亮度。其实Y就是图像的灰度值,而I和Q则是指色调,即描述图像色彩及饱和度的属性。RGB与YIQ之间的对应关系如下:3 YUV色彩系统YUV色彩系统被欧洲的电视系统所采用,其中Y和上面的YIQ色彩系统中的Y相同,都是指亮度。U和V虽然也是指色调,但是和I与Q的表达方式不完全相同。RGB与YUV之间的对应关系如下:4 YCbCr色彩系统YCbCr色彩系统也是一种常见的色彩系统,JPEG采用的色彩系统正是该系统。它是从YUV色彩系统衍生出来的。其中Y还是指亮度,而Cb和Cr则是将U和V做少量调整而得到的。RGB色彩系统和YCbCr色彩系统之间
27、的对应关系如下:214 灰度图灰度图(Grayscale)是指只含亮度信息,不含色彩信息的图像。因此,要表示灰度图,就需要把亮度值进行量化。通常划分为0到255共256个级别,0最暗(全黑),255最亮(全白)。BMP格式的文件中并没有灰度图这个概念,但是可以很容易的用BMP文件来表示灰度图。方法是用256色的调色板,只不过这个调色板有点特殊,每一项的RGB值都是相同的。也就是说RGB值从(0,0,0),(1,1,1)一直到(255,255,255)。(0,0,0)是全黑色,(255,255,255)是全白色,中间的是灰色。对于R=G=B的色彩,带入YIQ或YUV色彩系统转换公式中可以看到其颜
28、色分量都是0,即没有色彩信息。灰度图使用比较方便。首先RGB的值都一样;其次。图像数据即颜色表索引值,也就是实际的RGB的亮度值;另外因为是256色的调色板,所以图像数据中一个字节代表一个像素。如果是彩色的256色图,图像处理后有可能会产生不属于这256种颜色的新颜色,所以,图像处理一般采用灰度图。22 GDI位图GDI是图形设备接口(Graphics Device Interface)的缩写。GDI位图是一种GDI对象,在Microsoft基本类(MFC)库中用CBitmap类来表示。在CBitmap类对象中,包含一种和Windows的GDI模块有关的Windows数据结构,该数据结构是与设
29、备相关的。应用程序可以得到GDI位图数据结构的一个备份,但是其中位的安排则完全依赖于显示设备。可以将GDI位图数据在同一台计算机的内的不同的应用程序间任意传递,但是由于其对设备的依赖性,在不同类型计算机间的传递是没有任何意义的。下图是CBitmap类的继承关系图。CBitmap类封装了Windows GDI位图,同时提供了一些操作位图的成员函数。在使用CBitmap对象时,首先要创建一个CBitmap对象,然后把它选进设备环境中,再调用其成员函数进行处理,在使用完毕后,把它从设备环境中选出并删除。图2.2 CBitmap类的继承关系图221 从资源中装入GDI位图为了加载位图,可以使用CBit
30、map类的LoadBitmap()成员函数。LoadBitmap()函数有两种调用方式。BOOL LoadBitmap(LPCTSTR lpszResourseName );BOOL LoadBitmap(UINT nIDResourse );一种是通过资源名称(由参数lpszResourseName指定)来加载指定的GDI位图;另外一种是通过资源ID(由参数nIDResourse指定)来加载指定的GDI位图。222 伸缩位图有时,想对位图进行放大或缩小的操作,这时就可以使用StretchBlt()函数来显示位图。下面是该函数的原型:BOOL StretchBlt(int x,int y,in
31、t nWidth, int nHeight,CDC *pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop );该函数中各个参数含义如下: x:指定绘制区域的左上角x坐标(逻辑单位); y:指定绘制区域的左上角y坐标(逻辑单位); nWidth:指定绘制区域的宽度; nHeight:指定绘制区域的高度; pSrcDC:指向要复制位图所在的CDC对象的指针; xSrc:指定原位图要绘制区域的左上角x坐标(逻辑单位); ySrc:指定原位图要绘制区域的左上角y坐标(逻辑单位); nSrcWidth:指定要复制原图像的宽度
32、; nSrcHeight:指定要复制原图像的高度; dwRop:指定绘制方式。23 设备无关位图(DIB)DIB是Device-Independent Bitmap(设备无关位图)的缩写。它自带颜色信息,因此调色板管理非常容易。DIB也使打印时的灰度阴影的控制更加容易。任何运行Windows的计算机都可以处理DIB,它通常以BMP文件的形式被保存在磁盘中或则作为资源保存在EXE文件和DLL文件中。231 BMP文件中DIB的结构DIB是标准的Windows位图格式,BMP文件中包含了一个DIB。一个BMP文件大体上分成如下4个部分:图2.3 BMP文件结构示意图第一部分为位图文件头BITMAP
33、FILEHEADER,它是一个结构,其定义如下:typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;该结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下: bfType:指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有“.bmp
34、”文件的头两个字节都是“BM”。 bfSize:指定文件大小,包括这14个字。 bfReserved1,bfReserved2:为保留字,不用考虑。 bfOffBits:为从文件头到实际的位图数据的偏移字节数,即上图中前三个部分的和。第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeIma
35、ge; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;BITMAPINFOHEADER,FAR *LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;该结构的长度也是固定的,为40个字节。各个域的说明如下: biSize:指定这个结构的长度,为40字节。 biWidth:指定图像的宽度,单位是像素。 biHeight:指定图像的高度,单位是像素。 biPlanes:必须是1,不用考虑。 biBitCount:指定表示颜色时要用到的位数,常用的值为1(黑白
36、二色图)、4(16色图)、8(256色)、24(真彩色),新的“.bmp”格式支持32位色,这里就不做讨论了。 biCompression:指定位图是否压缩,有效的值为BI-RGB,BI-RLE8,BI-RLE4,BI-BITFIELDS(都是Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4和RLE8的压缩格式,但用的不多。今后所讨论的只有第一种不压缩的情况,即biCompression为BI-RGB的情况。 biSizeImage:指定实际的位图数据占用的字节数。 biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。 biYPelsPerMe
37、ter:指定目标设备的垂直分辨率,单位是像素/米。 biClrUsed:指定本图像实际用到的颜色数,如果该项为0,则用到的颜色数为2的biCompression次幂。 biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。第三部分为调色板(Palette)。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,它们的BITMAPINFOHEADER后面直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:ty
38、pedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;RGBQUAD;其中: rgbBlue:该颜色的蓝色分量。 rgbGreen:该颜色的绿色分量。 rgbRed:该颜色的红色分量。 rgbReserved:保留值。第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际的R、G、B值。下面就2色、16色、256色位图和真彩色位图分别介绍。 对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一
39、个字节可以表示8个像素。 对于16色位图,用4位可以表示一个像素的颜色,所以1个字节可以表示2个像素。 对于256色位图,1个字节刚好可以表示1个像素。 对于真彩色图,3个字节才能表示1个像素。232 DIB访问函数Windows支持一些重要的DIB访问函数,但是这些函数都还没有被封装到MFC中,这些函数主要有:1 SetDIBitsToDevice函数:该函数可以直接在显示器或打印机上显示DIB。 在显示时不进行缩放处理。2 StretchDIBits函数:该函数可以缩放显示DIB于显示器和打印机上。3 GetDIBits函数:还函数利用申请到的内存,由GDI位图来构造DIB。通过该函数,可
40、以对DIB的格式进行控制,可以指定每个像素颜色的位数,而且可以指定是否进行压缩。4 CreateDIBitmap函数:利用该函数可以从DIB出发来创建GDI位图。5 CreateDIBSection函数:该函数能创建一种特殊的DIB,称为DIB项,然后返回一个GDI位图句柄。6 LoadImage函数:该函数可以直接从磁盘文件中读入一个位图,并返回一个DIB句柄。7 DrawDibDraw函数:Windows提供了窗口视频(VFW)组件,Visual C+支持该组件。VFW中的DrawDibDraw函数是一个可以替代StretchDIBits的函数。它的最主要的优点是可以使用抖动颜色,并且提高
41、显示DIB的速度,缺点是必须将VFW代码连接到进程中。233 使用DIB读写BMP文件虽然MFC没有封装DIB,但是在程序中使用DIB还是十分方便的。作者构造了自己的DIB函数库,这样在使用DIB时,只要对它进行调用就可以了。接下来作者使用这些DIB函数编写了一个简单的读写BMP的多文档应用程序。该程序不但可以直接读写BMP文件,打印当前DIB,还支持剪贴板操作,复制当前DIB到剪贴板,可以将剪贴板中现有的DIB拷贝到当前的DIB中。下面是读写DIB的程序流程图:图2.4 建立与打开图像图2.5 保存图像下面是程序打开一幅图像时的界面:第三章 图像的几何变换图像的几何变换,通常包括图像的平移、
42、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。程序基本框架如下:图3.1 程序基本框架图31 图像的平移图像的平移是几何变换中最简单的变换之一。311 理论基础图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。设(x0,y0)为原图像上的一点,图像水平平移量为tx,垂直平移量为ty,则平移后点(x0,y0)坐标将变为(x1,y1)。显然(x0,y0)和(x1,y1)的关系如下:用矩阵表示如下:对该矩阵求逆,可以得到逆变换: 即这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty
43、)。如果tx或ty大于0,则(- tx,- ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为0或则255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有点被移出显示区域。如果不想丢失被移出的部分图像,可以将新生成的图像宽度扩大|tx |,高度扩大| ty |。312 Visual C+编程实现有了上面的理论基础,可以十分容易的用Visual C+来实现图像的平移。在这里,只介绍灰度图像的平移,因为灰度图像每个像素位数正好是8位,即1个字节,这样,在进行图像处理时,可以不必考虑拼凑字节的问题。而且由于灰度图调色板的特殊性,进行灰度图像处理时,不必考虑调色
44、板的问题。根据上面的公式可以得到图像的平移程序流程图:图3.2 图像平移程序流程图由上面的程序流程图可以得到如下算法:/每行for(i=0;ilHeight;i+) /每列for(j=0;j=0)&(j0=0)&(i0lHeight)/指向原DIB第i0行,第j0个像素的指针 /同样要注意DIB上下倒置的问题lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;/复制像素*lpDst=*lpSrc;else *(unsigned char*)lpDst)=255; /对于原图中没有的像素,直接赋值为255由于每行像素是连续放置的,可以直接逐行地
45、来复制图像。首先计算移出后可视的区域。对于x轴方向, 当tx -width时,图像完全移出了屏幕,不用做任何处理; 当-width tx 0时,图像区域的x范围从0到width-,对应原图的范围从到width; 当0 txwidth时,图像区域的x范围从tx到width,对应原图的范围从0到width-tx; 当tx width时,图像完全移出了屏幕,不用做任何处理;对于y轴方向, 当ty -height时,图像完全移出了屏幕,不用做任何处理; 当-height ty 0时,图像区域的y范围从0到height- ,对应原图的范围从到height; 当0 tyheight时,图像区域的y范围从ty到height,对应原图的范围从0到height-ty; 当ty height时,图像完全移出了屏幕,不用做任何处理;当计算出经移动而可视的区域后,就可以利用位图存储的连续性,即同一行的像素在内存中是相邻的这一规则进行计算。利用memcpy函数,从(x0,y0)点开始,一次可以拷贝一整行(宽度为x1-x0),然后将内存指针移到(x0,y0+1)处,