数字图像处理几何运算1.引言几何运算与点运算不同,它可改变图象中物体(像素)之间的空间关系。这种运算可以看成将各像素在图像内移动的过程。几何变换是图像处理和图像分析的重要内容,按照变换性质可以分为位置变换、形状变换以及复合变换。图像几何变换是指用数学建模的方法来描述图像位置、大小、形状等变化的方法。几何变换常用于摄像机的几何校正过程,这对于利用图象进行几何测量的工作是十分重要的。在实际场景拍摄到的一幅图像,如果画面过大或过小,都需要进行缩小或放大。如果拍摄时景物与摄像头不成相互平行关系的时候,会发生一些几何畸变,例如会把一个正方形拍摄成一个梯形等。这就需要进行一定的畸变校正。在进行目标物的匹配时,需要对图像进行旋转、平移等处理。在进行三维景物显示时,需要进行三维到二维平面的投影建模。因此,图像几何变换是图像处理及分析的基础。2.知识点一、几何变换基础知识齐次坐标欧式几何变换矩阵二、图像中的几何变换平移变换旋转变换缩放变换仿射变换射影变换三、总结11121321222331323311xhhhxyhhhyhhhcossinsincos10011xyxsstxyssty1112212210011xyxaatxyaaty3.几何变换基础1.齐次坐标在电脑图形内无处不在,因为该坐标允许平移、旋转、缩放及透视投影等可表示为矩阵与向量相乘的一般向量运算。例如,在透视投影里,空间中的位置与该位置至称为“投影中心”的固定点间的线相关联。该点可透过找出平面与该线之相交点被映射至该平面上。这是三维物件如何呈现于眼上的一精确表示。在最简单的情况下,投影中心会是圆点,而点会映射至平面z=1上,如同在笛卡儿坐标上时一样。对空间内的一点(x,y,z),其线与平面相交的点为(x/z,y/z,1)。删掉现在显得多余的z坐标,即变成(x,y,z)。在齐次坐标里,二维点(x,y)的齐次坐标表示为(hx,hy,h)。空间点(x,y,z)表示为(xw,yw,zw,w),且该点映射至平面上的点表示为(xw,yw,zw)。由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)。3.几何变换基础2.欧式几何是几何学的一门分科。又称欧几里德几何。公元前3世纪,古希腊数学家欧几里德(英文Euclid,希腊文Ε'νκλειδη)把人们公认的一些几何知识作为定义和公理,在此基础上研究图形的性质,推导出一系列定理,组成演绎体系,写出《几何原本》,形成了欧氏几何。在其公理体系中,最重要的是平行公理,由于对这一公理的不同认识,导致非欧几何的产生。按所讨论的图形在平面上或空间中,分别称为“平面几何”与“立体几何”。欧几里德几何指按照欧几里德的《几何原本》构造的几何学。欧式几何有时就指平面上的几何,即平面几何。三维空间的欧式几何通常叫做立体几何。数学上,欧式几何是平面和三维空间中常见的几何,基于点线面假设。数学家也用这一术语表示具有相似性质的高维几何。3.几何变换基础3.矩阵变换是数学线性代数中的一个概念。在线性代数中,线性变换能够用矩阵表示。是线性代数中矩阵的一种运算形式。在线性代数中,例如初等变换是指以下三种变换类型:(1)交换矩阵的两行(对调i,j,两行记为ri,rj);(2)以一个非零数k乘矩阵的某一行所有元素(第i行乘以k记为ri×k);(3)把矩阵的某一行所有元素乘以一个数k后加到另一行对应的元素(第j行乘以k加到第i行记为ri+krj)。图形变换的矩阵变换有如下的几种:(1)平移变换从一个位置到另一个位置的变换可以用平移矩阵T表示,该矩阵对图形进行平移操作。(2)旋转变换旋转矩阵将图形绕平面上点(x,y)或x,y,z轴进行旋转。(3)缩放矩阵对于一个二维非齐次坐标(x,y),我们想让它扩大2倍,则可以让它变成(2x,2y)。还有错切矩阵、刚体矩阵等。4.图像中的几何变换1.平移变换初始坐标为(x0,y0)的点经过平移(tx,ty)(以向右,向下为正方向)后,坐标变为(x1,y1)。这两点之间的关系是x1=x0+tx,y1=y0+ty。图像的平移变换就是将图像中的所有像素点按照给定的平移量进行水平(x方向)和垂直(y方向)移动。平移变换分为两种类型:图像大小变化和图像大小不变。第一种类型保证图像平移的完整信息,第二种图像的原始信息部分可能丢失。其齐次表示矩阵表示为:1010100110011xyxtxyty其非齐次表示矩阵表示为:矩阵:称为平移变换矩阵(因子),tx和ty为平移量。1001001xytt0101xytxxItyy图像平移变换程序voidImageTranslation2(constMat&src,Mat&dstImage,intXoffset,intYoffset){intnRowNum=src.rows+abs(Yoffset);intnColNum=src.cols+abs(Xoffset);dstImage.create(nRowNum,nColNum,src.type());for(inti=0;inRowNum;i++){inty=i-Yoffset;for(intj=0;jnColNum;j++){intx=j-Xoffset;if(x0&&xsrc.cols&&y0&&ysrc.rows){dstImage.atVec3b(i,j)=src.atVec3b(y,x);}}}}4.图像中的几何变换2.旋转变换旋转变换是由一个图形改变为另一个图形,在改变过程中,原图上所有的点都绕一个固定的点换同一方向,转动同一个角度。旋转变换是欧氏几何中的一种重要变换。在欧氏平面上(欧氏空间中),让每一点P绕一固定点(固定轴线)旋转一个定角,变成另一点P′,如此产生的变换称为平面上(空间中)的旋转变换。此固定点(固定直线)称为旋转中心(旋转轴),该定角称为旋转角。而且旋转是第一种正交变换。其齐次表示矩阵表示为:矩阵:称为旋转变换矩阵(因子),θ为旋转角度。1010cossin0sincos010011xxyycossin0sincos00010101cossinsincosxxyy其非齐次表示矩阵表示为:图像旋转变换程序voidRotIamge(constMat&srcImage,Mat&dstImage,doubleangle){//弧度doublesita=angle*CV_PI/180;doublea=(srcImage.cols-1)/2.0;doubleb=(srcImage.rows-1)/2.0;intsrcRow=srcImage.rows;intsrcCol=srcImage.cols;doublex1=-a*cos(sita)-b*sin(sita);doubley1=-a*sin(sita)+b*cos(sita);doublex2=a*cos(sita)-b*sin(sita);doubley2=a*sin(sita)+b*cos(sita);doublex3=a*cos(sita)+b*sin(sita);doubley3=a*sin(sita)-b*cos(sita);doublex4=-a*cos(sita)+b*sin(sita);doubley4=-a*sin(sita)-b*cos(sita);intw1=cvRound(max(abs(x1-x3),abs(x4-x2)));inth1=cvRound(max(abs(y1-y3),abs(y4-y2)));dstImage.create(h1,w1,srcImage.type());......}4.图像中的几何变换3.缩放变换将图像乘以一定系数,从而产生新图像的过程。缩放算法是设某点坐标,在x轴方向扩大sx倍,y轴方向扩大sy倍,[x0,y0]为变换前坐标,[x1,y1]为变换后坐标。x1=sx*x0;y1=sy*y0。尺度缩小的变换:按照一定的间隔选取某些行和列的像素构成新的图像。新图像会出现空行和空列,需要用插值的方法加以填补,但存在“马赛克”现象,图像的细节将变得不明显。尺度放大的变换:在一些点处可能找不到图像原像,就需要进行近似处理。其齐次表示矩阵表示为:其非齐次表示矩阵表示为:矩阵:称为缩放变换矩阵(因子),sx和sy为缩放量。1010000010011xyxsxysy0000001xyss010100xysxxsyy图像缩放变换程序//最近邻插值的实现代码voidNearstInterpolation(constMat&srcImage,Mat&dstImage,doublekx,doubleky){CV_Assert(srcImage.data!=NULL);doubleinv_kx=1.0/kx;doubleinv_ky=1.0/ky;intsrcRowNum=srcImage.rows;intsrcColNum=srcImage.cols;intdstRowNum=cvRound(srcImage.rows*ky);intdstColNum=cvRound(srcImage.cols*kx);dstImage.create(dstRowNum,dstColNum,srcImage.type());for(inti=0;idstRowNum;i++){inty=cvRound(i*inv_ky);if(ysrcRowNum-1)y=srcRowNum-1;for(intj=0;jdstColNum;j++){intx=cvRound(j*inv_kx);if(xsrcColNum-1)x=srcColNum-1;dstImage.atVec3b(i,j)=srcImage.atVec3b(y,x);}}}4.图像中的几何变换4.仿射变换定义:由一个平面/立体图形变换到另一个平面/立体图形,在改变的过程中保持直线和平行线不变(平行线映射为平行线)。任何仿射变换都可以分解为缩放、平移、旋转和切变的组合。相似变换可以看做是仿射变换的特殊情况。线性变换包括旋转、缩放、切变,但不包含平移,因此仿射变换也定义为一个线性变换再加上一个平移变换。二维平面经过一系列仿射变换后,把点变为点,线变为线,用向量表示时,向量的线性关系不变,线性相关的两个向量在变换后仍然线性相关。仿射变换有六个自由度。其齐次表示矩阵表示为:其非齐次表示矩阵表示为:矩阵:称为仿射变换矩阵的分解,U、V是正交矩阵,为保距变换,D为一个非均匀缩放变换。011112012122xytxxaatyyaa11112012122010011xyxaatxyaaty11122122()()TTTaaUDVUVVDVaa图像仿射变换程序#includecv.h#includehighgui.hintmain(){CvPoint2D32fsrcTri[3],dstTri[3];CvMat*rot_mat=cvCreateMat(2,3,CV_32FC1);CvMat*warp_mat=cvCreateMat(2,3,CV_32F