资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章 图像的几何变换,张 桦,教授,天津理工大学,计算机与通信工程学院,本章要点:,图像的平移,图像的镜像变换,图像的缩放,图像的转置,图像的旋转,3.1,图像的平移,1.,理论基础,图像平移(,Translation,),是将图像中所有的点都按照指定的平移量,进行水平、垂直移动。,设初始坐标为(,x0,y0,)的点,经过平移(,tx,ty,)后,坐标变为,(x1,y1),。,1.,理论基础,tx,坐标原点,(x0,y0),ty,(x1,y1),图,3-1,像素平移示意图,显然(,x0,y0,),和(,x1,y1,),的关系如下:,x1=x0+tx,y1=y0+ty,2.,理论验证,x,y,y,(0,0),(0,0),x,y,(0,0),3.,流程设计,(1),取得原图的数据区指针。,(2),通过对话框输入偏移量,tx,ty,。,(3),开辟一个同样大小的缓冲区。,(4),对原图依次循环每个像素,每读入一个像素点,(,x0,y0),,,根据它的坐标,找到目标图像的位置(,x1=x0-tx,y1=y0-,ty,),,将像素(,x0,y0,),处的颜色值赋给新图中的(,x1,y1,)。,4.,编程实现,for(i=0;i wide;i+),for(,int,j=0;j=0)&(i0=0)&(j0 height)/,判断是否在新图范围内,lpDst,=(LPBYTE)temp+,lLineBytes,*(height-1-j0)+i0;,*,lpDst,=*,lpSrc,;/,复制象素,else,*(,unsigned char*),lpDst,)=255;/,对于源图中没有的象素,直接赋值为,255,3.2,图像的镜像变换,1,理论基础,图像的镜像变换分为两种:一种是水平镜像,另一种是垂直镜像。,图像的水平镜像操作是以原图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换;,图像的垂直镜像操作是以原图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。,镜像变换后图的高和宽都不变。,1.,理论基础,-,水平镜像,设图像高度为,Height,,,宽度为,Width,,,原图中的,(,x0,y0),经过水平镜像后,,坐标将变成(,Width-x0,y0,)。,即:,x1=Width-x0,y1=y0,1.,理论基础,-,垂直,镜像,点(,x0,y0,)经过垂直镜像后,,坐标将变成为(,x0,Height-y0,),,即:,x1=x0,y1=Height-y0,2,理论验证,(,a),原图,(,b),水平镜像处理效果图,(,c),垂直镜像处理效果图,图,3-2,镜像处理,3.,流程设计,(1),取得原图的数据区指针。,(2),开辟一个同样大小的缓冲区。,(3),每个像素依次循环。,在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标,(,用图像的宽度减去坐标值,),在显示到图像上。,垂直镜像中,则对垂直坐标做相应的处理。,4.,编程实现,-,水平镜像,for(j=0;j height;j+),for(i,=0;i wide;i+),lpSrc,=(LPBYTE)p_data+wide*j+,i,;,lpDst,=(LPBYTE)temp+wide*,j,+,wide,-,i,;,*,lpDst,=*,lpSrc,;,4.,编程实现,-,垂直镜像,for(i=0;i wide;i+),for(j,=0;j 1,且,ky,1,时,原图像被放大。,放大图像时,产生了新的像素,可通过插值算法来近似处理。,例如:当,kx,=,ky,=2,时,图像放大,2,倍,,原图中的某一个像素,对应新图的,4,个像素。,(,a,),原图中的某一个像素,(,b,),对应新图的,4,个像素,图,3-3,图像放大示意图,1,缩小图像,理论基础,当,kx,1,且,ky,1,时,原图像被缩小。,例如,当,kx,=,ky,=0.5,时,图像被缩到一半大小,原图中,4,个像素对应新图中的一个像素。此时缩小后的图像中的(,0,,,0,)像素对应于原图中的(,0,,,0,)、(,0,,,1,)、(,1,,,0,)、(,1,,,1,)像素一个;,以此类推。在原图基础上,每行隔一个像素取一点,每割一行进行操作。如下图,3-4,所示。,(,a,),原图中的某,4,个像素,(,b,),对应新图的,1,个像素,图,3-4,图像缩小示意图,从上可见,放大与缩小的原理不同。,2.,理论验证,(c,),长宽各放大,2,倍的效果图,(,a,)原图 (,b,)长宽缩小,0.5,倍的效果图,3.,流程设计,(1),取得原图的数据区指针。,(2),通过对话框获得放大整数比例:,kx,ky,。,更改图象的宽度和高度。,(3),每个像素依次循环。计算该象素在原图象中的坐标,将原图的象素值赋给目标象素相应位置,kx,*,ky,个值。,4.,编程实现,-,放大图像,/,针对图像每行进行操作,for(j=0;j height-1;j+),/,针对图像每列进行操作,for(i=0;i wide-1;i+),/,指向源,DIB,第,i0,行,第,j0,个象素的指针,lpSrc,=(LPBYTE)p_data+wide*j+i;,/,复制象素,for(,int,n=0;nk1;n+),for(,int,m=0;mk2;m+),lpDst,=(LPBYTE)temp +,newwide,*(j*k1+n)+i*k2+m;,*,lpDst,=*,lpSrc,;,4,编程实现,-,缩小图像,for(j=0;j,newheight,-1;j+),/,针对图像每列进行操作,for(i,=0;i=0)&(i0=0)&(j0 height)/,判断是否在源图范围内,/,指向源,DIB,第,i0,行,第,j0,个象素的指针,lpSrc,=(LPBYTE)p_data+wide*j0+i0;,*,lpDst,=*,lpSrc,;/,复制象素,else,*,lpDst,=255;/,对于源图中没有的象素,直接赋值为,255,3.4,图像的转置,1.,理论基础,图像的转置(,Transpose,),操作是将图像像素的,x,坐标和,y,坐标互换。该操作将改变图像的高度和宽度,转置后图像的高度和宽度将互换。,x1=y0,y1=x0,2,理论验证,图,3-6,图像转置,3.,流程设计,(1),取得原图的数据区指针。,(2),通过对话框输入偏移量,tx,ty,。,(3),开辟一个同样大小的缓冲区。,(4),对原图依次循环每个像素,,每读入一个像素点,(x0,y0),,根据它的坐标,找到目标图像的位置(,x1=y0,y1=x0,),,将像素(,x0,y0,)处的颜色值赋给新图中的(,x1,y1,)。,4.,编程实现,for(j,=0;j height;j+),/,针对每行图像每列进行操作,for(i=0;i wide;i+),/,指向源,DIB,第,j,行,第,i,个象素的指针,lpSrc,=(LPBYTE)p_data+,lLineBytes,*j+i,;,/,指向转置,DIB,第,i,行,第,j,个象素的指针,/,注意此处,wide,和,height,是源,DIB,的宽度和高度,应该互换,lpDst,=(LPBYTE)temp+,lNewLineBytes,*i+j,;,/,复制象素,*,lpDst,=*,lpSrc,;,3.5,图像的旋转,1.,理论基础,图像的旋转必须指明图像绕着什么旋转。,一般以图像的中心为原点,旋转一定的角度。,旋转后,图像的大小一般会改变。,1.,理论基础,如下图,点(,x0,y0,),经过旋转,度后坐标变成(,x1,y1,)。,3-7,图像旋转示意图,1.,理论基础,在旋转前:,x0=,cos(,),y0=,sin(,),旋转后:,x1=cos(-,)=,cos,(),cos,()+sin()sin(),=x0cos()+,y0sin(),y1=sin(-,)=sin(),cos,()-,cos,()sin(),=-,x0sin()+y0cos(),2.,理论验证,(,a,),原图,(,b,),旋转,45,的效果图,图,3-9,旋转处理,3.,流程设计,(1),以图像的中心为原点,旋转一定的角度。根据下图,将坐标系,变成坐标系,;,屏幕中的坐标一般是以左上角为原点,向右为,x,轴正方向、向下为,y,轴正方向,设其为坐标系,。,旋转是绕中心坐标轴原点,(,a,b,),进行的,向右为,x,轴正方向,向上为,y,轴正方向,设其为坐标系,;,如果是绕一个指定点(,a,b,)旋转,则先要将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。,3.,流程设计,(2),根据旋转公式,将该点顺时针旋转,角;,(3),将坐标系,变成坐标系,。,4.,编程实现,num1=(double)(-0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold);,num2=(double)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold);,for(y1=0;y1Hnew;y1,+),for(x1=0;x1=0)&(x0=0)&(y0Hold)/,在原图范围内,lpPtr,=,lpSrc,+y0*,Wold,+x0;,lpTempPtr,=,lpTemp,+y1*,Wnew,+x1;,*,lpTempPtr,=*,lpPtr,;/,进行象素的复制,小结,本章主要介绍了图象的预处理中最基本的几何变换处理,包括,图像的平移,、,图像的镜像变换,、,图像的缩放,、,图像的转置,、,图像的旋转,。这些是进行图象几何校正的基本方法。,谢 谢!,
展开阅读全文