面向对象程序设计学号:130085210002学生所在学院:信息工程学院学生姓名:邵丽群任课教师:熊邦书教师所在学院:信息工程学院2013级实现图像的几何变换电子信息工程信息工程学院摘要:几何变换是最常见的图像处理手段,通过对变形的图像进行几何校正,可以得出准确的图像。常用的几何变换功能包括图像的平移、图像的镜像变换、图像的转置、图像的缩放、图像的旋转等等。目前数字图像处理的应用越来越广泛,已经渗透到工业、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。作为数字图像处理的一个重要部分,本文接受的工作是如何VisualC++编程工具设计一个完整的应用程序,实现经典的图像几何变换功能。程序大概分为两大部分:读写BMP图像,和数字图像的几何变换。即首先用VisualC++创建一个单文档应用程序框架,在实现任意BMP图像的读写,打印,以及剪贴板操作的基础上,完成经典的图像几何变换功能。图像几何变换的VisualC++编程实现,为校内课题的实现提供了一个实例。关键字:图像处理;几何变换(图像的平移、缩放、转置、旋转和镜像变换);BMP图像;VisualC++一、引言图像几何变换是指用数学建模的方法来描述图像位置、大小、形状等变化的方法。在实际场景拍摄到的一幅图像,如果画面过大或过小,都需要进行缩小或放大。如果拍摄时景物与摄像头不成相互平行关系的时候,会发生一些几何畸变,例如会把一个正方形拍摄成一个梯形等。这就需要进行一定的畸变校正。在进行目标物的匹配时,需要对图像进行旋转、平移等处理。在进行三维景物显示时,需要进行三维到二维平面的投影建模。因此,图像几何变换是图像处理及分析的基础。图像几何变换是计算机图像处理领域中的一个重要组成部分,也是值得深讨的一个重要课题。在图像几何变换中主要包括图像的放缩、图像的旋转、图像的移动、图像的镜像、图像的块操作等内容,几何变换不改变图像的像素值,只改变像素所在的几何位置。从广义上说,图像是自然界景物的客观反映,是人类认识世界和人类本身的重要源泉。图像对我们并不陌生。我们生活在一个信息时代,科学研究和统计表明,人类从外界获得的信息约有75%来自视觉系统,也就是从图像中获得的。所以对数字图像的处理便显得尤为重要了。本文主要深讨了图像的几何变换(主要包括图像的平移、转置、缩放、旋转、镜像等)理论,并在此基础上用VisualC++实现的过程。1.3.2研究方法方法一:利用Windows本身就提供了一个API函数SetWorldTransForm来实现图片旋转、位移及其他变形,这个函数是对一个设备上下文DC进行操作,通过坐标转换来实现各种功能的。方法二:通过图像进行平移、旋转、转置、镜像、缩放后重新计算各点新像素完成几何变换。自定义一个图像处理的Cdibapi类,把一般处理图像时要用到的函数实现封装在这个类中,该类用于实现DIB对象的绘制,DIB对象调色板的创建,DIB对象的读取与存储,图像线性变换,图像灰度拉伸等。然后把在视类中实现图像平移,图像镜像,图像转置,图像缩放及图像旋转的函数调用和实现。二、正文2.1灰度图灰度图(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)是全白色,中间的是灰色。2.2调色板调色板结构LOGPALETTE,该结构定义如下:typedefstructtagLOGPALETTE{WORDpalVersion;//调色板的板本号,应该指定该值为0x300;WORDpalNumEntries;//调色板中的表项数,对于灰度图像该值为256;PALETEENTRYpalPalEntry[1];//调色板中的颜色表项,由于该表项的数目不一定,所以这里数组长度定义为1,灰度图像对应的该数组的长度为256}LOGPALETTE;颜色表项结构PALETTEENTRY定义了调色板中的每一个颜色表项的颜色和使用方式,定义如下:typedefstructtagPALETTEENTRY{BYTEpeRed;//R分量值;BYTEpeGreen;//G分量值;BYTEpeBlue;//B分量值;BYTEpeFlags;//该颜色被使用的方式,一般情况下设为0;}PALETTEENTRY;Windows系统使用调色板管理器来管理与调色板有关的操作,通常活动窗口的调色板即是当前系统调色板,所有的非活动窗口都必须按照此系统调色板来显示自己的颜色,此时调色板管理器将自动的用系统调色板中的最近似颜色来映射相应的显示颜色。如果窗口或应用程序按自己的调色板显示颜色,就必须将自己的调色板载入到系统调色板中,这种操作叫作实现调色板,实现调色板包括两个步骤:1.首先将调色板选择到设备上下文中,可以通过CDC::SelectPalette()选入设备上下文2.然后在设备上下文中实现调色板,可以通过CDC::RealizePalette()实现设备调色板。1.2.4BMP文件中DIB的结构DIB是标准的Windows位图格式,BMP文件中包含了一个DIB。一个BMP文件大体上分成如下4个部分:BITMAPFILEHEADER位图文件头(只用于BMP文件)BITMAPINFOHEADER位图信息头Palette调色板DIBPirxelsDIB图像数据bfType=”BM”bfSizebfReserved1bfReserved2bfOffBitsbiSizebiWidthbiHeightbiPlanesbiBitCountbiCompressionbiSizeImagebiXPelsPerMeterbiYPelsPerMeterbiClrUsedbiClrImportant单色DIB有2个表项16色DIB有16个表项或更少256色DIB有256个表项或更少真彩色DIB没有调色板每个表项长度为4字节(32位)像素按照每行每列的顺序排列每一行的字节数必须是4的整数2.3图像的几何变换基础知识图像的几何变换,通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。图2.1程序基本框架图2.3.1图像的平移图像的平移是几何变换中最简单的变换之一。图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。设(x0,y0)坐标将变为(x1,y1)。显然(x0,y0)和(x1,y1)的关系如下:{x1=x0+txy1=y0+ty用矩阵表示如下:[x1y11]=[10tx01ty001][x0y01]对该矩阵求逆,可以得到逆变换:[x0y01]=[10−tx01−ty001][x1y11]即{x0=x1−txy0=y1−ty这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty)。如果tx或ty大于0,则(-tx,-ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为0或则255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有点被移出显示区域。如果不想丢失程序开始读写BMP图像程序结束图像的平移图像的镜像图像的转置图像的缩放图像的旋转被移出的部分图像,可以将新生成的图像宽度扩大|tx|,高度扩大|ty|。2.3.2图像的镜像图像的镜像变换分为两种:一种是水平镜像,另外一种是垂直镜像。图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。设图像高度为lHeight,宽度为lWidth,原图中(x0,y0)经过水平镜像后坐标将变为(lWidth-x0,y0),其矩阵表达式为:[x1y11]=[−10lWidth01ty001][x0y01]逆运算表达式为:[x0y01]=[−10lWidth010001][x1y11]即同样,(x0,y0)经过垂直镜像后坐标将变为(x0,lHeight-y0),其矩阵表达式为:[x1y11]=[1000−1lHeight001][x0y01]逆运算矩阵表达式为:[x0y01]=[1000−1lHeight001][x1y11]即{x0=x1y0=lHeight−y12.3.3图像的转置图像的转置操作是将图像像素的x坐标和y坐标互换。该操作将改变图像的大小,图像的高度和宽度将互换。转置表达式:[x1y11]=[10tx01ty001][x0y01]它的逆矩阵表达式:[x0y01]=[10tx01ty001][x1y11]即{x0=x1y0=y12.3.4图像的缩放上面的几种图像几何变换中都是1:1的变换,而图像的缩放操作将会改变图像的大小,产生的图像中的像素可能在原图中找不到相应的像素点,这样就必须进行近似处理。一般的方法是直接赋值为和它最相近的像素值,也可以通过一些插值算法来计算。下面的代码直接采用了前一种做法。假设图像x轴方向缩放比率为fx,y轴方向缩放比率为fy,那么原图中点(x0,y0)对应与新图中的点(x1,y1)的转换矩阵为:[x1y11]=[fx000fy0001][x0y01]其逆运算如下:[x0y01]=[1/fx0001/fy0001][x1y11]即{x0=x1/fxy0=y1/fy例如,当fx=fy=0.5时,图像被缩放到一半大小,此时缩小后图像中的(0,0)像素对应于原图中的(0,0)像素;(0,1)像素对应于原图中的(0,2)像素;(1,0)像素对应于原图中的(2,0)像素,以此类推。在原图基础上,每行隔一个像素取一点,每隔一行进行操作。其实是将原图每行中的像素重复取值一遍,然后每行重复一次。2.3.5图像的旋转一般图像的旋转是以图像的中心为原点,旋转一定的角度。旋转后,图像的大小一般会改变。和图像平移一样,既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。可以推导一下旋转运算的变换公式。如下图所示,点(x0,y0)经过旋转θ度后坐标变成(x1,y1)。在旋转前:{x0=γcos(θ)y0=γsin(θ)转置后:{x1=γcos(α−θ)=γcos(α)cos(θ)+γsin(α)sin(θ)=x0cos(θ)+y0sin(θ)y1=γsin(α−θ)=γsin(α)cos(θ)−γcos(α)sin(θ)=−x0sin(θ)+y0cos(θ)写成矩阵表达式为:[x1y11]=[cos(θ)sin(θ)0−sin(θ)cos(θ)0001][x0y01]其逆运算如下:[x0y01]=[cos(θ)−sin(θ)0sin(θ)cos(θ)0001][x1y11]有了上面的转换公式,就可以非常方便的编写出实现图像旋转的函数。首先应计算出公式中需要的几个参数:a,b,c,d和旋转后新图像的高、宽度。现在已知图像的原始宽度为lWidth,高度为lHeight,以图像中心为坐标系原点,则原始图像四个角的坐标分别为(−lWidth−12,lHeight−12),(lWidth−12,lHeight−12),(lWidth−12,−lHeight−12)和(−lWidth−12,−lHeight−12),按照旋转公式,在旋转后的新图中,这四个点坐标为:(fDstX1,fDstY1)=(−lWidth−12cos(θ)+lHeight−12sin(θ),lWidth−12sin(θ)+lHeight−12cos(θ))(fDstX2,fDstY2)=(lWidth−12cos(θ)+lHeight−12sin(θ),−lWidth−12sin(θ)+lHeight−12cos(θ))(fDstX