毕业论文-图像处理系统-几何变换模块_第1页
毕业论文-图像处理系统-几何变换模块_第2页
毕业论文-图像处理系统-几何变换模块_第3页
毕业论文-图像处理系统-几何变换模块_第4页
毕业论文-图像处理系统-几何变换模块_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE 河北农业大学现代科技学院本科毕业论文 题 目:学 院: 现代科技学院 专业班级: 计算机科学与技术0901班 学 号: 学生姓名: 指导教师姓名: 指导教师职称: 讲师 二O一三 年 五 月 二十八 日摘要几何变换是最常见的图像处理手段,通过对变形的图像进行几何校正,可以得出准确的图像。常用的几何变换功能包括图像的平移、图像的镜像变换、图像的转置、图像的缩放、图像的旋转等等。目前数字图像处理的应用越来越广泛,已经渗透到工业、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。 作为数字图像处理的一个重要部分,本文介绍的工作是如何用Visual C+编程工具设计一个完整的应用程序

2、,实现经典的图像几何变换功能。程序大概分为两大部分:读写BMP图像,和数字图像的几何变换。即首先用Visual C+创建一个多文档应用程序框架,在实现任意BMP图像的读写,打印,以及剪贴板操作的基础上,完成经典的图像几何变换功能。 图像几何变换的Visual C+编程实现,为校内课题的实现提供了一个实例。 关键字:图像处理;几何变换;BMP图像;Visual C+ AbstractThe geometrical transformation is the most popular image processing method. We can get an exact image from a

3、 distorted image through the geometrical emendation. The transforming methods in common 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, aviatio

4、n, military, and has become much more important in every aspects of our life. Being 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 pro

5、gram can be divided into two parts: read or write a BMP image, and the geometrical 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.

6、 The implementation of geometrical transformation using Visual C+ is a good example for carrying out intramural problems. Keywords: Image processing; Geometrical transformation; BMP image; Visual C+目 录 TOC o 1-3 h z u HYPERLINK l _Toc358384326 1.何为数字图像处理 PAGEREF _Toc358384326 h 1 HYPERLINK l _Toc358

7、384327 1.1数字图像处理的发展及意义 PAGEREF _Toc358384327 h 1 HYPERLINK l _Toc358384328 1.2 数字图像处理的概述 PAGEREF _Toc358384328 h 1 HYPERLINK l _Toc358384329 1.3 Visual C+的介绍 PAGEREF _Toc358384329 h 2 HYPERLINK l _Toc358384330 1.4 将Visual C+应用于数字图像的几何变换 PAGEREF _Toc358384330 h 3 HYPERLINK l _Toc358384331 2.数字图像处理的基本

8、概念 PAGEREF _Toc358384331 h 4 HYPERLINK l _Toc358384332 2.1 图像和调色板 PAGEREF _Toc358384332 h 4 HYPERLINK l _Toc358384333 2.1.1 图像的显示 PAGEREF _Toc358384333 h 4 HYPERLINK l _Toc358384334 2.1.2 调色板 PAGEREF _Toc358384334 h 4 HYPERLINK l _Toc358384335 2.1.3 灰度图 PAGEREF _Toc358384335 h 5 HYPERLINK l _Toc3583

9、84336 2.2 设备无关位图(DIB) PAGEREF _Toc358384336 h 5 HYPERLINK l _Toc358384337 2.2.1 BMP文件中DIB的结构 PAGEREF _Toc358384337 h 5 HYPERLINK l _Toc358384338 2.2.2 DIB访问函数 PAGEREF _Toc358384338 h 8 HYPERLINK l _Toc358384339 2.2.3 使用DIB读写BMP文件 PAGEREF _Toc358384339 h 8 HYPERLINK l _Toc358384340 3.图像的几何变换 PAGEREF

10、_Toc358384340 h 11 HYPERLINK l _Toc358384341 3.1 图像的平移 PAGEREF _Toc358384341 h 11 HYPERLINK l _Toc358384342 3.1.1 理论基础 PAGEREF _Toc358384342 h 11 HYPERLINK l _Toc358384343 3.1.2 Visual C+编程实现 PAGEREF _Toc358384343 h 12 HYPERLINK l _Toc358384344 3.2 图像的镜像变换 PAGEREF _Toc358384344 h 14 HYPERLINK l _Toc

11、358384345 3.2.1 理论基础 PAGEREF _Toc358384345 h 14 HYPERLINK l _Toc358384346 3.2.2 Visual C+编程实现 PAGEREF _Toc358384346 h 15 HYPERLINK l _Toc358384347 3.3 图像的转置 PAGEREF _Toc358384347 h 17 HYPERLINK l _Toc358384348 3.3.1 理论基础 PAGEREF _Toc358384348 h 17 HYPERLINK l _Toc358384349 3.3.2 Visual C+编程实现 PAGERE

12、F _Toc358384349 h 17 HYPERLINK l _Toc358384350 3.4 图像的缩放 PAGEREF _Toc358384350 h 19 HYPERLINK l _Toc358384351 3.4.1 理论基础 PAGEREF _Toc358384351 h 19 HYPERLINK l _Toc358384352 3.4.2 Visual C+编程实现 PAGEREF _Toc358384352 h 19 HYPERLINK l _Toc358384353 3.5 图像的旋转 PAGEREF _Toc358384353 h 21 HYPERLINK l _Toc

13、358384354 3.5.1 理论基础 PAGEREF _Toc358384354 h 21 HYPERLINK l _Toc358384355 3.5.2 Visual C+编程实现 PAGEREF _Toc358384355 h 22 HYPERLINK l _Toc358384356 3.6投影校正 PAGEREF _Toc358384356 h 24 HYPERLINK l _Toc358384357 3.6.1理论基础 PAGEREF _Toc358384357 h 24 HYPERLINK l _Toc358384358 3.6.2 Visual C+编程实现 PAGEREF _

14、Toc358384358 h 26 HYPERLINK l _Toc358384359 结论 PAGEREF _Toc358384359 h 29 HYPERLINK l _Toc358384360 致谢 PAGEREF _Toc358384360 h 30 HYPERLINK l _Toc358384361 参考文献 PAGEREF _Toc358384361 h 31PAGE 311.何为数字图像处理1.1数字图像处理的发展及意义在20世纪20年代,图像处理首次应用于改善伦敦和纽约之间海底电缆发送的图片质量。直到20世纪50年代数字计算机发展到一定水平后,数字图像处理才真正引起人们的兴趣。

15、1964年美国喷气推进实验室(JPL),用计算机对“徘徊者2号”太空船发回的大批月球照片进行处理,受到明显的效果。60年代末,数字图像处理已经形成了比较完善的体系,形成一门新的学科。60年代到70年代,由于离散数学的创立和完善,使数字图像处理技术得到迅猛的发展,理论和方法进一步完善,应用范围更加广阔。这一时期,图像处理主要与模式识别和图像理解的研究相联系,如文字识别、医学图像处理、遥感图像的处理等。70年代后期至今,各个应用领域对数字图像处理提出越来越高的要求,促进这门学科向更高级的方向发展,特别是在景物理解和机器视觉方面,图像由二维处理变成三维解释。近几年来随着计算机和各个领域研究的迅速发展

16、,科学计算可视化、多媒体技术等的研究和应用,数字图像处理从一个专门领域的学科变成了一种新型的科学研究和人机界面的工具。从二十世纪六十年代美国航空和太空总署(NASA)的喷气推进实验室第一次使用计算机对太空船发回的大批月球图片进行处理到信息技术不断提高的今天,数字图像的应用处理技术得到了广泛的应用,形成了自己的技术特色和完善的学科体系。在日常生活中,图像处理已经得到广泛应用。例如,电脑人像艺术,电视中的特殊效果,自动售货机钞票的识别,邮政编码的自动识别和利用指纹、虹膜、面部等特征的身份识别等。在医学领域,很早以前就采用X射线透视、显微镜照片等来诊断疾病。现在,计算机图像处理已成为疾病诊断的重要手

17、段,用一般摄影方法不能获取的身体内部的状况,也能由特殊的图像处理装置获取,最具代表性的就是X射线CT(Computerized Tomograph)。 数字图像处理的产生和迅速发展主要受如下三个方面的影响。 一是计算机的发展。早期的计算机无论在计算速度或存储容量方面,难于满足对庞大图像数据进行实时处理的要求。随着计算机硬件技术及数字化技术的发展,计算机、内存及外围设备的价格急剧下降,而其性能却有了大幅度提高。过去只能用大型计算机完成的庞大处理,现在,在个人计算机上也能够轻而易举地实现。 二是数学的发展,特别是离散数学理论的创立和完善,为数字图像处理奠定了理论基础。 三是军事、医学和工业等方面应

18、用需求的不断增长。自20世纪20年代以来,图像处理首次应用于改善伦敦和纽约之间海底电缆发送的图片质量以来,经过几十年的研究与发展,数字图像处理的理论和方法进一步完善,应用范围更加广阔,已经成为一门新兴的学科,并在向更高级的方向发展。如在景物理解和计算机视觉(机器视觉)方面,图像处理已由二维处理发展到三维理解或解释。近几年来,随着计算机和各个相关领域研究的迅速发展,科学计算可视化、多媒体技术等研究和应用的兴起,数字图像处理从一个专门领域的学科,变成了一种新型的科学研究和人机界面的工具。 目前数字图像处理技术已成为计算机科学、信息科学、生物学、医学等学科研究的热点。这是因为图像处理学科不仅可以促进

19、人类的进步,还可以带来巨大的经济和社会效益。 1.2 数字图像处理的概述图像是对客观对象的一种相似性的、生动性的描述或写真。或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。它是人们最主要的信息来源。据统计,一个人获取的信息大约有75%来自视觉。图像根据其形式或产生方法来分类。 从人眼的视觉特点上可将图像分为可见图像和不可见图像。其中可见图像的一个子集为图片,它包括照片、用线条画的图和画;另一个子集为光图像,即用透镜、光栅和全息技术产生的图像。不可见的图像包括不可见光成像和不可见量,如温度、压力及人口密度等的分布图。 按波段多少图像可分为但波段、多波段和超波段图像。但波段图像上每点

20、只有一个亮度值;多波段图像上每点不只一个特性。例如红、绿、蓝三波段光谱图像或彩色图像上的每个点具有红、绿、蓝三个亮度值,这三个值表示在不同光波段上的强度,人眼看来就是不同的颜色。超波段图像上每个点具有几十或几百个特性。 按图像空间坐标和明暗程度的连续性可分为模拟图像和数字图像。模拟图像指空间坐标和明暗程度都是连续变化的、计算机无法直接处理的图像。数字图像是一种空间坐标和灰度均不连续的、用离散的数字(一般用整数)表示的图像。这样的图像才能被计算机处理。 对图像进行一系列的操作,以达到预期的目的的技术称作图像处理。图像处理【1】可分为模拟图像处理和数字图像处理两种方式。 利用光学、照像和电子学方法

21、对模拟图像的处理称为模拟图像处理。光学图像处理方法已有很长的历史,在激光全息技术出现后,它得到了进一步的发展。尽管光学图像处理理论日臻完善,且处理速度快,信息容量大,分辨率高,又非常经济,但处理精度不高,稳定性差,设备笨重,操作不方便和工艺水平不高等原因限制了它的发展速度。从20世纪60年代起,随着电子计算机技术的进步,计算机图像处理获得了飞跃发展。 所谓数字图像处理,就是利用计算机对数字图像进行系列操作,从而获得某种预期的结果的技术。数字图像处理离不开计算机,因此又称计算机图像处理。为了与模拟图像处理想区别,下文采用“数字图像处理”数字图像处理(Digital Image Processin

22、g),就是利用数字计算机或则其他数字硬件,对从图像信息转换而得到的电信号进行某些数学运算,以提高图像的实用性。例如从卫星图片中提取目标物的特征参数,三维立体断层图像的重建等。总的来说,数字图像处理包括点运算、几何处理、图像增强、图像复原、图像形态学处理、图像编码、图像重建、模式识别等。目前数字图像处理的应用越来越广泛,已经渗透到工业、医疗保健、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。1.3 Visual C+的介绍Visual C+(简称VC)【2】是微软公司提供的基于C/C+的应用程序集成开发工具。VC拥有丰富的功能和大量的扩展库,使用它能有效的创建高性能的Windows应

23、用程序和Web应用程序。VC的优越性主要表现在以下几个方面: 1开发分布式应用。 2开发的应用程序运行效率高、具有健壮性。 3能缩短软件升级周期。 4能够生成多线程应用,而多线程应用对于增加并发响应有实际意义。 VC除了提供高效的C/C+编译器外,还提供了大量的可重用类和组件,包括著名的微软基础类库(MFC)和活动模板类库(ATL),因此它是软件开发人员不可多得的开发工具。1.4 将Visual C+应用于数字图像的几何变换VC丰富的功能和大量的扩展库,类的重用特性以及它对函数库、DLL库的支持能使程序更好的模块化,并且通过向导程序大大简化了库资源的使用和应用程序的开发,正由于VC具有明显的优

24、势,因而我选择了它来作为数字图像几何变换的开发工具。 在本程序的开发过程中,VC的核心知识、消息映射机制、对话框控件编程等都得到了生动的体现和灵活的应用。 2.数字图像处理的基本概念2.1 图像和调色板 2.1.1 图像的显示 普通的显示器屏幕是由许多的点构成的,这些点称为像素。显示时采用扫描的方式:电子枪每次从左到右扫描一行,为每个像素着色,然后再像这样从上到下扫描整个屏幕,利用人眼的视觉暂留效应就可以显示出一屏完整的图像。为了防止闪烁,每秒要重复上述扫描过程几十次。一般刷新频率大于80Hz时,人眼感受不到屏幕刷新而产生的闪烁,这种显示器被称为位映像设备。所谓位映像,就是指一个二维的像素矩阵

25、,而位图就是采用位映像方法显示和存储的图像。对于彩色图像,它的显示必须从三原色RGB的概念说起。众所周知,自然界中的所有颜色都可以由红绿蓝(R、G、B)3原色组合而成。针对三原色成分的多少,可以人为的将每种颜色分成0到255共256个等级。这样,根据红、绿、蓝各种不同的组合,就能表示出256*256*256(约1600万)种颜色。当一幅图中每个像素被赋予不同的RGB值时,就能呈现出五彩缤纷的颜色了,这就形成了彩色图像。 2.1.2 调色板 如果一幅图像的每个像素都用其RGB分量来表示,那么所有的图像文件都将变的非常庞大,实际上的做法不完全是这样的,可以先来看一个简单的计算。 对一幅200*20

26、0的16色图像,它共有40 000个像素,如果每一个像素都用R、G、B三个分量表示,则一个像素需要3个字节,这样保存整个图像要用200*200*3即120 000字节。但是如果采用下面的方法,就能省很多字节。 对于16色图像,图中最多只有16种颜色,如果采用一个颜色表,表中的每一行记录一种颜色的R、G、B值,这样当表示一个像素的颜色时,只需要指出该颜色是在第几行,即该颜色在颜色表中的索引值便可以。例如,如果表的第0行为255,0,0(红色),那么当某个像素为红色时,只需要标明0即可。通过颜色索引表来表示图像,16种状态可以用4位(bit)表示,所以一个像素要用半个字节。整个图像要用200*20

27、0*0.5即20 000字节,在加上颜色表占用3*16=48字节,也不过20 048字节。这样一幅图像整个占用的字节数只是前面的1/6。 其实这张RGB表,就是通常所说的调色板(Palette),或颜色查找表LUT(Look Up Table)。不仅仅是Windows位图,其他许多图像文件格式,例如“.pcx”、“.tif”、“.gif”等都用到了调色板。还有一种情况,即真彩色图像(又叫做24位图像)的颜色种类高达256*256*256=16 777 216种,也就是包含上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图像是说它具有显示所有颜色的能力,即可以包含所有的颜色。通常,在表示真彩

28、色图像时,每个像素直接用R、G、B这3个分量字节表示,而不采用调色板技术。原因很简单:如果使用调色板,表示一个像素颜色在调色板中的索引要用24位,这和直接用R、G、B这3个分量表示用的字节数一样,不但没有节省任何空间,还要加上一个256*256*256*3个字节大的调色板。所以真彩色直接用R、G、B这3个分量表示。 2.1.3 灰度图 灰度图(Grayscale)【3】是指只含亮度信息,不含色彩信息的图像。因此,要表示灰度图,就需要把亮度值进行量化。通常划分为0到255共256个级别,0最暗(全黑),255最亮(全白)。 BMP格式的文件中并没有灰度图这个概念,但是可以很容易的用BMP文件来表

29、示灰度图。方法是用256色的调色板,只不过这个调色板有点特殊,每一项的RGB值都是相同的。也就是说RGB值从(0,0,0),(1,1,1)一直到(255,255,255)。(0,0,0)是全黑色,(255,255,255)是全白色,中间的是灰色。对于R=G=B的色彩,带入YIQ或YUV色彩系统转换公式中可以看到其颜色分量都是0,即没有色彩信息。 灰度图使用比较方便。首先RGB的值都一样;其次。图像数据即颜色表索引值,也就是实际的RGB的亮度值;另外因为是256色的调色板,所以图像数据中一个字节代表一个像素。如果是彩色的256色图,图像处理后有可能会产生不属于这256种颜色的新颜色,所以,图像处

30、理一般采用灰度图。 2.2 设备无关位图(DIB)DIB是Device-Independent Bitmap(设备无关位图)【4】的缩写。它自带颜色信息,因此调色板管理非常容易。DIB也使打印时的灰度阴影的控制更加容易。任何运行Windows的计算机都可以处理DIB,它通常以BMP文件的形式被保存在磁盘中或则作为资源保存在EXE文件和DLL文件中。2.2.1 BMP文件中DIB的结构DIB是标准的Windows位图格式,BMP文件中包含了一个DIB。一个BMP文件大体上分成如下4个部分: 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构,其定义如下:typedef struc

31、t tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;该结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:bfType:指定文件类型,必须是0 x424D,即字符串“BM”,也就是说所有“.bmp”文件的头两个字节都是“BM”。bfSize:指定文件大小,包括这14个字

32、。bfReserved1,bfReserved2:为保留字,不用考虑。bfOffBits:为从文件头到实际的位图数据的偏移字节数,即上图中前三个部分的和。图2.3 BMP文件结构示意图第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage; LONG biXPelsPerMeter;

33、 LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;BITMAPINFOHEADER,FAR *LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;该结构的长度也是固定的,为40个字节。各个域的说明如下:biSize:指定这个结构的长度,为40字节。biWidth:指定图像的宽度,单位是像素。biHeight:指定图像的高度,单位是像素。biPlanes:必须是1,不用考虑。biBitCount:指定表示颜色时要用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色)、24(真彩色),新

34、的“.bmp”格式支持32位色,这里就不做讨论了。biCompression:指定位图是否压缩,有效的值为BI-RGB,BI-RLE8,BI-RLE4,BI-BITFIELDS(都是Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4和RLE8的压缩格式,但用的不多。今后所讨论的只有第一种不压缩的情况,即biCompression为BI-RGB的情况。biSizeImage:指定实际的位图数据占用的字节数。biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。biYPelsPerMeter:指定目标设备的垂直分辨率,单位是像素/米。biClrUsed

35、:指定本图像实际用到的颜色数,如果该项为0,则用到的颜色数为2的biCompression次幂。biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的。第三部分为调色板(Palette)。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,它们的BITMAPINFOHEADER后面直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:typedef struct tagRGBQUAD BYTE rgbBlue

36、; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;RGBQUAD;其中:rgbBlue:该颜色的蓝色分量。rgbGreen:该颜色的绿色分量。rgbRed:该颜色的红色分量。rgbReserved:保留值。第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际的R、G、B值。下面就2色、16色、256色位图和真彩色位图分别介绍。对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。对于16色位图,用4位可以表示一个像素的颜色,所以1个字节

37、可以表示2个像素。对于256色位图,1个字节刚好可以表示1个像素。对于真彩色图,3个字节才能表示1个像素。2.2.2 DIB访问函数Windows支持一些重要的DIB访问函数,但是这些函数都还没有被封装到MFC中,这些函数主要有:SetDIBitsToDevice函数:该函数可以直接在显示器或打印机上显示DIB。 在显示时不进行缩放处理。StretchDIBits函数:该函数可以缩放显示DIB于显示器和打印机上。GetDIBits函数:还函数利用申请到的内存,由GDI位图来构造DIB。通过该函数,可以对DIB的格式进行控制,可以指定每个像素颜色的位数,而且可以指定是否进行压缩。CreateDI

38、Bitmap函数:利用该函数可以从DIB出发来创建GDI位图。CreateDIBSection函数:该函数能创建一种特殊的DIB,称为DIB项,然后返回一个GDI位图句柄。LoadImage函数:该函数可以直接从磁盘文件中读入一个位图,并返回一个DIB句柄。DrawDibDraw函数:Windows提供了窗口视频(VFW)组件,Visual C+支持该组件。VFW中的DrawDibDraw函数是一个可以替代StretchDIBits的函数。它的最主要的优点是可以使用抖动颜色,并且提高显示DIB的速度,缺点是必须将VFW代码连接到进程中。2.2.3 使用DIB读写BMP文件虽然MFC没有封装DI

39、B,但是在程序中使用DIB还是十分方便的。作者构造了自己的DIB函数库,这样在使用DIB时,只要对它进行调用就可以了。接下来作者使用这些DIB函数编写了一个简单的读写BMP的多文档应用程序。该程序不但可以直接读写BMP文件,打印当前DIB,还支持剪贴板操作,复制当前DIB到剪贴板,可以将剪贴板中现有的DIB拷贝到当前的DIB中。下面是读写DIB的程序流程图:图2.4 建立与打开图像图2.5 保存图像下面是程序打开一幅图像时的界面:图2.6 图像示例3.图像的几何变换图像的几何变换【5】,通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。程序基本框架如下:图3.1 程序基

40、本框架图3.1 图像的平移3.1.1 理论基础图像平移【6】就是将图像中所有的点都按照指定的平移量水平、垂直移动。设为原图像上的一点,图像水平平移量为,垂直平移量为,则平移后点坐标将变为。显然和的关系如下:用矩阵表示如下:对该矩阵求逆,可以得到逆变换: 即这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty)。如果tx或ty大于0,则(- tx,- ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为0或则255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有

41、点被移出显示区域。如果不想丢失被移出的部分图像,可以将新生成的图像宽度扩大|tx |,高度扩大| ty |。3.1.2 Visual C+编程实现有了上面的理论基础,可以十分容易的用Visual C+来实现图像的平移。在这里,只介绍灰度图像的平移,因为灰度图像每个像素位数正好是8位,即1个字节,这样,在进行图像处理时,可以不必考虑拼凑字节的问题。而且由于灰度图调色板的特殊性,进行灰度图像处理时,不必考虑调色板的问题。可以得到如下算法: /* Void CimgProcess:ImMove(CimgProcess * pTo,int x,int y) 功能: 平移图像 注: 图像范围不变 参数:

42、 CimgProcess * pTo:处理后得到的图像的CimgProcess指针 int x:水平右移距离 int y:垂直下移距离 返回值:无 */ void CimgProcess:ImMove(CimgProcess* pTo,int x,int y) int nHeight = pTo-GetHeight(); int nWidth = pTo-GetWidthPixl(); int i,j; if(xnWidth | ynHeight) MessageBox(NULL,”超过图片大小”,“错误”,MB-OK|MB-ICONERROR); return; for(i=0;inWidt

43、h;i+) for(j=0;j0 & i-x0 &j-ySetPixel(i,j,GetPixel(i-x,j-y); else pTo-SetPixel(i,j,RGB(255,255,255);/for j/for x利用ImMove()函数实现图像平移的完整示例被封装在DIPDemo工程的视图类函数void CDIPDemoView:OnGeomTran()中,调用ImMove()函数的代码片段如下所示:/输出的临时对象 CimgProcess imgOutput = imgInput;/调用ImMove()函数实现图像平移imgInput.ImMove(&imgOutput,lXOff

44、set,lYOffset);/其中lXOffset是水平方向的平移量,lYOffset是竖直方向的平移量/将结果返回给文档类pDoc-m_Image = imgOutput;上述程序运行时会弹出对话框,要求用户设置平移量参数。可以通过程序DIPDemo中的菜单命令“几何变换-图像平移”来观察处理效果。下面是程序进行平移时的界面:图3.2 平移之前图图像平移后的结果为:图3.3 平移之后图3.2 图像的镜像变换图像的镜像变换【7】分为两种:一种是水平镜像,另外一种是垂直镜像。图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;图像的垂直镜像操作是将图像上半部分和下半

45、部分以图像水平中轴线为中心镜像进行对换。3.2.1 理论基础设图像高度为lHeight,宽度为lWidth,原图中(x0,y0)经过水平镜像后坐标将变为(lWidth-x0,y0),其矩阵表达式为:逆运算矩阵表达式为: 即同样,(x0,y0)经过垂直镜像后坐标将变为(x0,lHeight-y0),其矩阵表达式为:逆运算矩阵表达式为: 即3.2.2 Visual C+编程实现(1)水平镜像的Visual C+实现。 /* void CimgProcess:HorMirror(CimgProcess * pTo) 功能: 图像的水平镜像 注: 图像左右镜像 参数: CimgProcess * pT

46、o: 处理后得到的图像的CimgProcess指针 返回值: 无 */ void CimgProcess:HorMirror(CimgProcess* pTo) int nHeight = pTo-GetHeight(); int nWidth = pTo-GetWidthPixel(); int i,j; int u; for(i=0;inWidth;i+) u=nWidth-i-1; for(j=0;jSetPixel(i,j,GetPixel(u,j); /for j/for i利用HorMirror()函数实现水平镜像的完整示例被封装在DIPDemo工程的视图类函数void CDIPD

47、emoView:OnGeomMirh()中,调用HorMirror()函数的代码片段如下所示:CImgProcess imgOutput = imgInput; /输出的临时对象imgInput.HorMirror(&imgOutput); /调用HorMirror()函数实现图像水平镜像pDoc-m_Image = imgOutput; /将结果返回给文档类可以通过程序DIPDemo中的菜单命令“几何变换-水平镜像”来观察处理效果(2)竖直镜像的Visual C+实现/*Void CimgProcess:VerMirror(CimgProcess * pTo)功能: 图像的竖直镜像注: 图像

48、上下镜像参数: CimgProcess * pTo: 处理后得到的图像的CimgProcess指针返回值: 无*/void CimgProcess:VerMirror(CimgProcess* pTo) int nHeight = pTo-GetHeight(); int nWidth = pTo-GetWidthPixel(); int i,j; int u=0; for(i=0;inWidth;i+) for(j=0;jSetPixel(i,j,GetPixel(i,u);/for j/for i 利用VerMirror()函数实现竖直镜像的完整示例被封装在DIPDemo工程的视图类函数v

49、oid CDIPDemoView:OnGeomMirror()中,调用VerMirror()函数的代码片段如下所示:CimgProcess imgOutput = imgInput; /输出的临时对象imgInput.VerMirror(&imgOutput); /调用VerMirror()函数实现图像竖直镜像pDoc-m_Image = imgOutput; /将结果返回给文档类可以通过程序DIPDemo中的菜单命令“几何变换-竖直镜像”来观察处理效果水平镜像后的结果为:图3.4 水平镜像之前图垂直镜像后的结果为:图3.5 水平镜像之后图3.3 图像的转置图像的转置操作是将图像像素的x坐标和

50、y坐标互换。该操作将改变图像的大小,图像的高度和宽度将互换。3.3.1 理论基础转置的变换矩阵表达式很简单:它的逆矩阵表达式是: 即3.3.2 Visual C+编程实现图像转置的实现和图像镜像变换相似,不同之处在于图像转置后DIB的头文件也要进行相应的改变,主要是将头文件中图像高度和宽度信息更新。因此传递给图像转置函数的参数是直接指向DIB的指针,而不是直接指向DIB像素的指针。/*void CimgProcess:Transpose(CimgProcess * pTo)功能: 图像的转置注: 图像水平竖直方向互换,图像大小不变参数: CimgProcess * pTo:处理后得到的图像的C

51、imgProcess指针返回值: 无*/void CimgProcess:Transpose(CImgProcess* pTo) int nHeight = pTo-GetHeight(); int nWidth = pTo-GetWidthPixel(); int i,j; for(i=0;inWidth;i+) for(j=0;jnHeight;j+) if(jnWidth & iSetPixel(i,j,GetPixel(j,i); else pTo-SetPixel(i,j,RGB(255,255,255);/for j/for i利用Transpose()函数实现图像转置的完整示例被

52、封装在DIPDemo工程的视图类函数void CDIPDemoView:OnGeomTrpo()中,调用Transpose()函数的代码片段如下所示:CImgProcess imgOutput = imgInput; /输出的临时对象imgInput.Transpose(&imgOutput); /调用Transpose()函数实现图像图像转置 pDoc-m_Image = imgOutput; /将结果返回给文档类可以通过程序DIPDemo中的菜单命令“几何变换-图像转置”来观察处理效果图像转置后的结果为:图3.6 转置之后图3.4 图像的缩放上面的几种图像几何变换中都是1:1的变换,而图像

53、的缩放【8】操作将会改变图像的大小,产生的图像中的像素可能在原图中找不到相应的像素点,这样就必须进行近似处理。一般的方法是直接赋值为和它最相近的像素值,也可以通过一些插值算法来计算。下面的代码直接采用了前一种做法。3.4.1 理论基础假设图像x轴方向缩放比率为fx,y轴方向缩放比率为fy,那么原图中点(x0,y0)对应与新图中的点(x1,y1)的转换矩阵为:其逆运算如下: 即例如,当fx=fy=0.5时,图像被缩放到一半大小,此时缩小后图像中的(0,0)像素对应于原图中的(0,0)像素;(0,1)像素对应于原图中的(0,2)像素;(1,0)像素对应于原图中的(2,0)像素,以此类推。在原图基础

54、上,每行隔一个像素取一点,每隔一行进行操作。其实是将原图每行中的像素重复取值一遍,然后每行重复一次。3.4.2 Visual C+编程实现/*void CImgProcess:Scale(CImgProcess * pTo,double times)功能: 图像的等比例缩放注: 包括扩大缩小,图像大小不变参数: CImgProcess * pTo:处理后得到的图像的CImgProcess指针 double times: 缩放因子返回值: 无*/void CImgProcess:Scale(CImgProcess* pTo,double times) int nHeight = pTo-GetH

55、eight(); int nWidth = pTo-GetWidthPixel(); int i,j for(i=0;inWidth;i+) for(j=0;jnHeight;j+) if(int(i*1/times+0.5)nWidth& int(j*1/times+0.5)SetPixel(i,j,GetPixel(int(i*1/times+0.5),int(j*1/times+0.5); else pTo-SetPixel(i,j,RGB(255,255,255);/for j/for i利用Scale()函数实现图像缩放的完整示例被封装在DIPDemo工程中的视图类函数void CD

56、IPDemoView:OnGeomZoom()。其中调用Scale()函数的代码片段如下所示:CImgProcess imgOutput = imgInput; /输出的临时对象imgInput.Scale(&imgOutput,fZoomRatio); /调用Scale()函数实现图像缩放/其中fZoomRatio为缩放比例Pdoc-m_Image = imgOutput; /将结果返回给文档类上述程序运行时会弹出对话框,要求用户设置缩放比例。可以通过示例程序DIPDemo中的菜单命令“几何变化-图像缩放”来观察处理效果。下面是进行缩放的界面:图3.7 缩放之前图缩放后的结果为:图3.8 缩

57、放之后图3.5 图像的旋转一般图像的旋转【9】是以图像的中心为原点,旋转一定的角度。旋转后,图像的大小一般会改变。和图像平移一样,既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。3.5.1 理论基础可以推导一下旋转运算的变换公式。如下图所示,点(x0,y0)经过旋转度后坐标变成(x1,y1)。在旋转前:旋转后: 写成矩阵表达式为:其逆运算如下:3.5.2 Visual C+编程实现有了上面的转换公式,就可以非常方便的编写出实现图像旋转的函数。首先应计算出公式中需要的几个参数:a,b,c,d和旋转后新图像的高、宽度。现在已知图像的原始宽度为lWidth,高度为lHeight,

58、以图像中心为坐标系原点,则原始图像四个角的坐标分别为,和,按照旋转公式,在旋转后的新图中,这四个点坐标为: 则新图像的宽度lNewWidth和高度lNewHeight为:lNewWidth=max(,)lNewHeight=max(,)令因为a=,b=,c=,d=所以则程序算法如下:/*void CImgProcess:Rotate(CImgProcess * pTo,float ang)功能: 以原点为中心的图像旋转注: 围绕左上顶点顺时针旋转,图像范围不变参数: CImgProcess * pTo:处理后得到的图像的CImgProcess指针返回值: 无*/void CImgProcess

59、:Rotate(CImgProcess* pTo,float ang) int nHeight = pTo-GetHeight(); int nWidth = pTo-GetWidthPixel(); int i,j; /目标图像坐标 int u,v; /源图像坐标 for(i=0;inWidth;i+) for(j=0;jnHeight;j+) u=int(i*cos(ang*PI/180)+j*sin(ang*PI/180)+0.5); v=int(j*cos(ang*PI/180)-i*sin(ang*PI/180)+0.5); if(unWidth & v=0 & v=0) pTo-S

60、etPixel(i,j,GetPixel(u,v); else pTo-SetPixel(i,j,RGB(0,0,0);/for j/for i利用 Rotate()函数实现图像旋转的完整示例被封装在DIPDemo工程的视图类函数void CDIPDemoView:OnGeomRota()中,调用Rotate()函数的代码片段如下所示:/输出的临时对象CIPmgProcess imgOutput = imgInput;/调用Rotate()函数实现图像旋转imgInput.Rotate(&imgOutput, iRotateAngle);/其中iRotateAngle是旋转角度,默认为30度/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论