vc实现图像的基本几何变换.doc_第1页
vc实现图像的基本几何变换.doc_第2页
vc实现图像的基本几何变换.doc_第3页
vc实现图像的基本几何变换.doc_第4页
vc实现图像的基本几何变换.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

Vc实现图像的基本几何变换图像的几何变换,通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。程序基本框架如下:图1.1 程序基本框架图11 图像的平移图像的平移是几何变换中最简单的变换之一。111 理论基础图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。设(x0,y0)为原图像上的一点,图像水平平移量为tx,垂直平移量为ty,则平移后点(x0,y0)坐标将变为(x1,y1)。显然(x0,y0)和(x1,y1)的关系如下:用矩阵表示如下:对该矩阵求逆,可以得到逆变换: 即这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty)。如果tx或ty大于0,则(- tx,- ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为0或则255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有点被移出显示区域。如果不想丢失被移出的部分图像,可以将新生成的图像宽度扩大|tx |,高度扩大| ty |。112 Visual C+编程实现有了上面的理论基础,可以十分容易的用Visual C+来实现图像的平移。在这里,只介绍灰度图像的平移,因为灰度图像每个像素位数正好是8位,即1个字节,这样,在进行图像处理时,可以不必考虑拼凑字节的问题。而且由于灰度图调色板的特殊性,进行灰度图像处理时,不必考虑调色板的问题。根据上面的公式可以得到图像的平移程序流程图:图1.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由于每行像素是连续放置的,可以直接逐行地来复制图像。首先计算移出后可视的区域。对于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)处,拷贝下一行。这样拷贝到(y1-y0)行就完成了全部操作,避免了单个像素的计算,从而提高了效率。按照上面的描述,现在可以构造自己的图像几何变换函数库了。首先来完成图像的平移函数。图像的平移函数操作不需要改变DIB的调色板和文件头,只要把指向DIB像素起始位置的指针和DIB高宽传递给子函数就可以完成平移工作。下面以图像平移为例说明图像处理的简易流程图:图1.3 图像平移处理的简易流程图下面是程序进行平移时的界面:图像平移后的结果为:12 图像的镜像变换图像的镜像变换分为两种:一种是水平镜像,另外一种是垂直镜像。图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。121 理论基础设图像高度为lHeight,宽度为lWidth,原图中(x0,y0)经过水平镜像后坐标将变为(lWidth-x0,y0),其矩阵表达式为:逆运算矩阵表达式为: 即同样,(x0,y0)经过垂直镜像后坐标将变为(x0,lHeight-y0),其矩阵表达式为:逆运算矩阵表达式为: 即122 Visual C+编程实现按照上面的变换公式,可以非常简单的实现图像的水平和垂直镜像操作。下图是镜像操作的程序流程图:图1.4 图像镜像程序流程图算法如下所示(bDirection为真时表示水平镜像,否则为垂直):/每行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和图像平移一样,在垂直镜像中也可以利用位图存储的连续性整行复制图像。水平镜像后的结果为:垂直镜像后的结果为:13 图像的转置图像的转置操作是将图像像素的x坐标和y坐标互换。该操作将改变图像的大小,图像的高度和宽度将互换。131 理论基础转置的变换矩阵表达式很简单:它的逆矩阵表达式是: 即132 Visual C+编程实现图像转置的实现和图像镜像变换相似,不同之处在于图像转置后DIB的头文件也要进行相应的改变,主要是将头文件中图像高度和宽度信息更新。因此传递给图像转置函数的参数是直接指向DIB的指针,而不是直接指向DIB像素的指针。根据公式可以得到如下所示的程序流程图:图1.5 图像转置程序流程图根据上图可以得到如下算法:for(i=0;ilHeight;i+) /针对图像每行进行操作 for(j=0;jbiWidth=lHeight;lpbmi-biHeight=lWidth;else lpbmc-bcWidth=(unsigned short)lHeight;lpbmc-bcHeight=(unsigned short)lWidth;图像转置后的结果为:14 图像的缩放上面的几种图像几何变换中都是1:1的变换,而图像的缩放操作将会改变图像的大小,产生的图像中的像素可能在原图中找不到相应的像素点,这样就必须进行近似处理。一般的方法是直接赋值为和它最相近的像素值,也可以通过一些插值算法来计算。下面的代码直接采用了前一种做法。141 理论基础假设图像x轴方向缩放比率为fx,y轴方向缩放比率为fy,那么原图中点(x0,y0)对应与新图中的点(x1,y1)的转换矩阵为:其逆运算如下: 即例如,当fx=fy=0.5时,图像被缩放到一半大小,此时缩小后图像中的(0,0)像素对应于原图中的(0,0)像素;(0,1)像素对应于原图中的(0,2)像素;(1,0)像素对应于原图中的(2,0)像素,以此类推。在原图基础上,每行隔一个像素取一点,每隔一行进行操作。其实是将原图每行中的像素重复取值一遍,然后每行重复一次。142 Visual C+编程实现按照上面的转换公式,可以容易的写出图像的缩放程序流程图:图1.6 图像缩放程序流程图根据流程图可以编写如下算法:memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+:PaletteSize(lpDIB);/复制DIB信息头和调色板lpNewDIBBits=:FindDIBBits(lpNewDIB); /找到新DIB像素起始位置lpbmi=(LPBITMAPINFOHEADER)lpNewDIB; /获取指针lpbmc=(LPBITMAPCOREHEADER)lpNewDIB;/更新DIB中图像的宽度和高度if(IS_WIN30_DIB(lpNewDIB) lpbmi-biWidth=lNewWidth;lpbmi-biHeight=lNewHeight;else lpbmc-bcWidth=(unsigned short)lNewWidth;lpbmc-bcHeight=(unsigned short)lNewHeight;for(i=0;ilNewHeight;i+) /针对图像每行进行操作 for(j=0;j=0)&(j0=0)&(i0biWidth=lNewWidth;lpbmi-biHeight=lNewHeight;else lpbmc-bcWidth=(unsigned short)lNewWidth;lpbmc-bcHeight=(unsigned short)lNewHeight; for(i=0;ilNewHeight;i+) /针对图像每行进行操作 for(j=0;j=0)&(j0=0)&(i0lHeight) /指向原DIB第i0行,第j0个像素的指针lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;*lpDst=*lpSrc; /复制像素else *(unsigned char*)lpDst)

温馨提示

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

评论

0/150

提交评论