图像几何变换
- 格式:doc
- 大小:684.00 KB
- 文档页数:8
图像的⼏何运算@⽬录图像的⼏何运算是指引起图像⼏何形状发⽣改变的变换。
与点运算不同的是,⼏何运算可以看成是像素在图像内的移动过程,该移动过程可以改变图像中物体对象之间的空间关系。
1.图像的插值图像插值是指利⽤已知邻近像素点的灰度值来产⽣位置像素点的灰度值,以便由原始图像再⽣成具有更⾼分辨率的图像。
插值是在不⽣成新的像素的情况下对原图像的像素重新分布,从⽽改变像素数量的⼀种⽅法。
在图像放⼤过程中,像素也相应的增加,增加的过程就是‘插值’发⽣作⽤的过程,‘’插值程序⾃动选择信息较好的像素作为增加、弥补空⽩像素的空间,⽽并⾮只使⽤近邻的像素,所以在放⼤图像时,图像看上去会⽐较平滑、⼲净。
⽆论使⽤何种插值⽅法,⾸先都需要找到与输出图像像素相对应的输⼊图像点,然后再通过计算该点附近某⼀像素集合的权平均值来指定输出像素的灰度值。
像素的权是根据像素到点的距离来⽽定的,不同插值⽅法的区别就在于考虑的像素集合不同。
最常见的插值⽅法如下:(1)向前映射法:通过输⼊图像像素的位置,计算输出图像对应像素的位置,将该位置像素的灰度值按某种⽅式分配到输出图像相邻的四个像素。
(2)向后映射法:通过输出图像像素位置,计算输⼊图像对应像素的位置,根据输⼊图像相邻四个像素的灰度值计算该位置像素的灰度值。
(3)最近邻插值:表⽰输出像素将被指定为像素点所在位置处的像素值。
(4)双线性插值:表⽰输出像素值是像素2×2邻域内的平均值。
(5)双三次插值:表⽰输出像素值是像素4×4邻域内的权平均值。
在MATLAB中,interp2函数⽤于对图像进⾏插值处理,该函数的调⽤⽅法如下:A=interp2(X,Y,Z,IX,IY):Z为要插值的原始图像,IX和IY为图像的新⾏和新列clear allclose allclcI2=imread('eight.tif');subplot(231)imshow(I2)title('原始图像')Z1=interp2(double(I2),2,'nearest');%最近邻插值法Z1=uint8(Z1);subplot(232)imshow(Z1)title('最近邻插值')Z2=interp2(double(I2),2,'linear');%线性插值法Z2=uint8(Z2);subplot(232)imshow(Z2)title('线性插值法')Z3=interp2(double(I2),2,'spline');%三次样条插值法Z3=uint8(Z3);subplot(234)imshow(Z3);title('三次样条插值');Z4=interp2(double(I2),2,'cubic');%⽴⽅插值法Z4=uint8(Z4);subplot(235);imshow(Z4);title('⽴⽅插值')2.旋转与平移变换旋转变换的表达式为⽤齐次矩阵表⽰为在MATLAB中,使⽤imrotate函数来旋转⼀幅图像,调⽤格式如下:B=imrotate(A,ANGLE,METHOD,BBOX)其中,A是需要旋转的图像;ANGLE是旋转的⾓度,正值为逆时针;METHOD是插值⽅法;BBOX表⽰旋转后的显⽰⽅式。
数字图像处理---图像的⼏何变换图像的⼏何变换图像的⼏何变换包括了图像的形状变换和图像的位置变换图像的形状变换图像的形状变换是指图像的放⼤、缩⼩与错切图像缩⼩图像的缩⼩是对原有的数据进⾏挑选或处理,获得期望缩⼩尺⼨的数据,并尽量保持原有的特征不消失分为按⽐例缩⼩和不按⽐例缩⼩两种最简单的⽅法是等间隔地选取数据图像缩⼩实现设原图像⼤⼩为M ∗N ,缩⼩为K 1M ∗K 2N (K 1<1,K 2<1)1. 设原图为F (i ,j ),i =1,2,...,M ,j =1,2,...,N ;压缩后地图像为G (x ,y ),x =1,2,...,k 1M ,y =1,2,...,k 2N2. G (x ,y )=F (c 1∗i ,c 2∗j );其中,c 1=1/k 1,c 2=1/k 2图像放⼤图像放⼤时对多出的空位填⼊适当的值,是信息的估计最简单的思想是将原图像中的每个像素放⼤为k ∗k 的⼦块图像放⼤实现设原图像⼤⼩为M ∗N ,缩⼩为K 1M ∗K 2N (K 1>1,K 2>1)1. 设原图为F (i ,j ),i =1,2,...,M ,j =1,2,...,N ;压缩后地图像为G (x ,y ),x =1,2,...,k 1M ,y =1,2,...,k 2N2. G (x ,y )=F (c 1∗i ,c 2∗j );其中,c 1=1/k 1,c 2=1/k 2图像错切图像错切变换实际上是平⾯景物在投影平⾯上的⾮垂直投影效果图像错切的数学模型x ′=x +d x y y ′=y(x ⽅向的错切,dx =tan θ)x ′=x y ′=y +d y x(y ⽅向的错切,dy =tan θ)图像的位置变换图像的位置变换是指图像的平移、镜像与旋转,即图像的⼤⼩和形状不发⽣变化主要⽤于⽬标识别中的⽬标配准图像平移公式:{{x ′=x +Δx y ′=y +Δy图像镜像图像镜像分为⽔平镜像和垂直镜像,即左右颠倒和上下颠倒公式:图像⼤⼩为M*Nx ′=x y ′=−y (⽔平镜像)x ′=−x y ′=y(垂直镜像)由于不能为负,因此需要再进⾏⼀次平移x ′=x y ′=N +1−y (⽔平镜像)x ′=M +1−xy ′=y(垂直镜像)图像旋转公式:x ′=xcos θ−ysin θy ′=xsin θ+ycos θ由于计算结果值所在范围与原有值不同,因此需要在进⾏扩⼤画布、取整、平移等处理画布扩⼤原则:以最⼩的⾯积承载全部的画⾯信息⽅法:根据公式x ′=xcos θ−ysin θy ′=xsin θ+ycos θ计算x ′min ,x ′max ,y ′min ,y ′max旋转后可能导致像素之间相邻连接不再连续,因此需要通过增加分辨率的⽅式填充空洞插值最简单的⽅式就是⾏插值(列插值)⽅法1. 找出当前⾏的最⼩和最⼤的⾮背景点坐标,记作:(i,k1)、(i,k2)2. 在(k1,k2)范围内进⾏插值,插值⽅法为空点的像素值等于前⼀点的像素值3. 重复上述操作直⾄没有空洞图像的仿射变换图像的仿射变换即通过通⽤的仿射变换公式,表⽰⼏何变换{{{{{{{齐次坐标原坐标为(x,y),定义齐次坐标为(wx,wy,w)实质上是通过增加坐标量来解决问题仿射变换通式通过齐次坐标定义仿射变换通式为x ′=ax +by +Δx y ′=cx +dy +Δy⇒x ′y ′=a b Δx c dΔyx y⼏何变换表⽰1. 平移x ′y ′1=10Δx 01Δy 001x y12. 旋转x ′y ′1=cos θ−sin θ0sin θcos θ0001x y 13. ⽔平镜像x ′y ′1=−10001001x y14. 垂直镜像x ′y ′1=1000−10001x y15. 垂直错切x ′y ′1=1d x 00−10001x y16. ⽔平错切x ′y ′1=100d y −10001x y1图像的⼏何校正由于图像成像系统的问题,导致拍摄的图⽚存在⼀定的⼏何失真⼏何失真分为{[][][][][][][][][][][][][][][][][][][][][]1. 系统失真:有规律的、可预测的2. ⾮系统失真:随机的⼏何校正的基本⽅法是先建⽴⼏何校正的数学模型,其次利⽤已知条件确定模型参数,最后根据模型对图像进⾏⼏何校正步骤:1. 图像空间坐标的变换2. 确定校正空间各像素的灰度值(灰度内插)途径:1. 根据畸变原因,建⽴数学模型2. 参考点校正法,根据⾜够多的参考点推算全图变形函数空间坐标变换实际⼯作中利⽤⼀幅基准图像f(x,y),来校正失真图像g(x′,y′)根据⼀些控制点对,建⽴两幅图像之间的函数关系,通过坐标变换,以实现失真图像的⼏何校正两幅图像上的f(x,y)=g(x′,y′)时,称其为对应像素(同名像素)通过表达式x′=h1(x,y)y′=h2(x,y)表⽰两幅图像之间的函数关系通常⽤多项式x′=n∑i=0n−i∑j=0a ij x i y jy′=n∑i=0n−i∑j=0b ij x i y j来近似h1(x,y)、h2(x,y)当多项式系数n=1时,畸变关系为线性变换x′=a00+a10x+a01yy′=b00+b10x+b01y六个未知数需要⾄少三个已知点来建⽴⽅程式当多项式系数n=2时,畸变关系式为x′=a00+a10x+a01y+a20x2+a11xy+a02y2y′=b00+b10x+b01y+b20x2+b11xy+b02y2 12个未知数需要⾄少6个已知点来建⽴⽅程式当超过已知点数⽬超过要求时,通过最⼩⼆乘法求解n=2时多项式通式为B2∗n=H2∗6A6∗n(n为待求点数)B2∗n=x′1x′2⋯x′n y′1y′2⋯y′n{ []H 2∗6=a 00a 10a 01a 20a 11a 02b 00b 10b 01b 20b 11b 02A 6∗n =11⋯1x 1x 2⋯x n y 1y 2⋯y n x 21x 22⋯x 2n x 1y 1x 2y 2⋯x n y ny 21y 22⋯y 2n同名点对要求1. 数量多且分散2. 优先选择特征点直接法利⽤已知点坐标,根据x ′=h 1(x ,y )y ′=h 2(x ,y )⇒x =h ′1(x ′,y ′)y =h ′2(x ′,y ′)x =n ∑i =0n −i∑j =0a ′ij x ′i y′jy =n ∑i =0n −i∑j =0b ′ijx ′i y ′j解求未知参数;然后从畸变图像出发,根据上述关系依次计算每个像素的校正坐标,同时把像素灰度值赋予对应像素,⽣成校正图像由于像素分布的不规则,导致出现像素挤压、疏密不均等现象,因此最后还需要进⾏灰度内插,⽣成规则图像间接法间接法通过假定⽣成图像的⽹格交叉点,从⽹格交叉点(x,y)出发,借助已知点求取未知参数,根据x ′=n ∑i =0n −i∑j =0a ij x i y jy ′=n ∑i =0n −i∑j =0b ij x i y j推算⽹格交叉点(x,y)对应畸变图像坐标(x',y'),由于对应坐标⼀般不为整数,因此需要通过畸变图像坐标周围点的灰度值内插求解,作为⽹格交叉点(x,y)的灰度值间接法相对直接法内插较为简单,因此常采⽤间接法作为⼏何校正⽅法像素灰度内插最近邻元法最近邻元法即根据四邻域中最近的相邻像素灰度决定待定点灰度值该⽅法效果较佳,算法简单,但是校正后图像存在明显锯齿,即存在灰度不连续性双线性内插法[][]{{双线性内插法是利⽤待求点四个邻像素的灰度在两个⽅向上作线性内插该⽅法相较最近邻元法更复杂,计算量更⼤,但是没有灰度不连续的缺点,且具有低通滤波性质,图像轮廓较为模糊三次内插法三次内插法利⽤三次多项式S(x)来逼近理论最佳插值函数sin(x)/xS(x)=1−2|x|2+|x|30≤|x|<1 4−8|x|+5|x|2−|x|31≤|x|<20|x|≥2该算法计算量最⼤,但是内插效果最好,精度最⾼{Processing math: 100%。
图像的几何变换,是指使用户获得或设计的原始图像,按照需要产生大小、形状和位置的变化。
从变换的性质分,图像的几何变换有位置变换(平移、镜像、旋转)、形状变换(比例缩放、错切)和复合变换等。
1. 图像的位置变换主要包括图像平移变换、图像镜像变换和图像旋转变换等,下面针对这三个主要的位置变换进行分析。
平移变换的几点说明:(1)平移后图像上的每一点都可以在原图像中找到对应的点。
对于不在原图像中的点,可以直接将它的像素值统一设置为0或者255(对于灰度图就是黑色或白色)。
(2)若图像平移后图像不放大,说明移出的部分被截断。
(3) 若不想丢失被移出的部分图像,将新生成的图像扩大.图像镜像变换图像的镜像变换不改变图像的形状。
图像的镜像(Mirror)变换分为三种:水平镜像,垂直镜像和对角镜像。
1. 图像水平镜像图像的水平镜像操作是将图像左半部分和右半部分以图像垂直中轴线为中心进行镜像对换。
2. 图像垂直镜像图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换。
3. 图像对角镜像图像的对角镜像操作是将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换。
相当于将图像先后进行水平镜像和垂直镜像。
图像旋转变换旋转(rotation)有一个绕着什么转的问题,通常的做法是以图像的中心为圆心旋转,将图像上的所有像素都旋转一个相同的角度。
图像的旋转变换是图像的位置变换,但旋转后,图像的大小一般会改变。
和图像平移一样,在图像旋转变换中既可以把转出显示区域的图像截去,旋转后也可以扩大图像范围以显示所有的图像。
2. 图像形状变换图像比例缩放变换图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。
(1). 图像的比例缩小变换从数码技术的角度来说,图像的缩小是将通过减少像素个数来实现的,因此,需要根据所期望缩小的尺寸数据,从原图像中选择合适的像素点,使图像缩小之后可以尽可能保持原有图像的概貌特征不丢失,下面介绍两种简单的图像缩小变换。
图像几何变换的原理及应用1. 引言图像几何变换是指通过对图像进行旋转、平移、缩放和仿射变换等操作,改变图像的位置、大小和形状,以达到特定的目的。
在计算机视觉、图像处理和计算机图形学等领域中,图像几何变换被广泛应用于图像的校正、增强、变换和特征提取等任务。
2. 原理图像几何变换的原理基于几何学的相关理论。
对于二维图像来说,可以通过变换矩阵对图像进行坐标变换,从而实现图像的几何变换。
以下是常见的图像几何变换操作及其原理:2.1 旋转旋转是指将图像按一定角度绕某个中心点进行旋转变换。
旋转操作可以通过变换矩阵实现,变换矩阵如下所示:cosθ -sinθ 0sinθ cosθ 00 0 1其中,θ表示旋转的角度。
通过对每个像素进行坐标变换,可以实现图像的旋转。
2.2 平移平移是指将图像沿着水平或垂直方向进行平移操作,即改变图像的位置。
平移操作可以通过变换矩阵实现,变换矩阵如下所示:1 0 tx0 1 ty0 0 1其中,tx和ty分别表示在x轴和y轴上的平移距离。
通过对每个像素进行坐标变换,可以实现图像的平移。
2.3 缩放缩放是指改变图像的尺寸大小。
缩放操作可以通过变换矩阵实现,变换矩阵如下所示:sx 0 00 sy 00 0 1其中,sx和sy分别表示在x轴和y轴上的缩放比例。
通过对每个像素进行坐标变换,并根据缩放比例进行采样,可以实现图像的缩放。
2.4 仿射变换仿射变换是指通过线性变换和平移来对图像进行变换。
仿射变换可以通过变换矩阵实现,变换矩阵如下所示:a11 a12 txa21 a22 ty0 0 1其中,a11、a12、a21和a22分别表示仿射变换的线性变换部分,tx和ty分别表示平移部分。
通过对每个像素进行坐标变换,并根据变换矩阵进行计算,可以实现图像的仿射变换。
3. 应用图像几何变换在各个领域中有着广泛的应用,以下列举了一些常见的应用场景:3.1 图像校正在图像处理中,由于各种因素的影响,例如相机畸变、透视变换等,图像可能会出现失真或畸变。
图像几何变换一、实验目的(1)学习几种常见的图像几何变换,并通过实验体会几何变换的效果;(2)掌握图像平移、剪切、缩放、旋转、镜像、错切等几何变换的算法原理及编程实现(3)掌握matlab编程环境中基本的图像处理函数(4)掌握图像的复合变换二、涉及知识点(1)图像几何变换不改变图像像素的值,只改变像素所在的几何位置(2)图像裁剪imcrop函数,语法格式为:B=imcrop(A);交互式用鼠标选取区域进行剪切B=imcrop(A,[left top right bottom]);针对指定的区域[left top right bottom]进行剪切(3)图像缩放imresize函数,语法格式为:B = imresize(A,m,method)这里参数method用于指定插值的方法,可选用的值为'nearest'(最邻近法),'bilinear'(双线性插值),'bicubic'(双三次插值),默认为'nearest'。
B = imresize(A,m,method)返回原图A的m倍放大的图像(m小于1时效果是缩小)。
(4)图像旋转imrotate函数,语法格式为:B = imrot ate(A,angle,’crop’),参数crop用于指定裁剪旋转后超出图像的部分。
三、实验内容(1)将图像hehua.bmp裁剪成200X200大小,并保存(2)制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色填充(3)利用剪切图像函数制作动画(4)将图像分别放大1.5倍和缩小0.8倍,插值方法使用最近邻域法和双线性插值法,对比显示图像。
(5)将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。
(6)将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果具体实现:1.将图像hehua.bmp裁剪成200X200大小,并保存I=imread('hehua.bmp');n=size(I);figure;subplot(1,2,1);imshow(I);title('原图');I=double(I);I1=zeros(200,200,n(3));I1=I(1:200,1:200,1:n(3));subplot(1,2,2);imshow(uint8(I1));title('裁剪');imwrite(uint8(I1),'hehua1.bmp','bmp');2.制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色填充I=imread('hehua1.bmp');[m,n,l]=size(I);figure;imshow(I);title('原图');I=double(I);for i=1:10x=10*i;y=10*i;subplot(3,4,i);G=zeros(m,n,l)+255;for i=1:m-x-1for j=1:n-y-1for k=1:lG(i,j,k)=I(i+x+1,j+y+1,k);endendendimshow(uint8(G));title('平移图');end3. 利用剪切图像函数制作动画I=imread('hehua.bmp');[m,n,l]=size(I);figure;subplot(3,4,1);imshow(I);title('原图');I=double(I);for i=1:10x=200-i*20;y=200+i*20;subplot(3,4,i+1);G=imcrop(I,[x,x,y,y]) imshow(uint8(G));end4. 将图像分别放大1.5倍和缩小0.8倍,插值方法使用最近邻域法和双线性插值法,对比显示图像。
im=imread('hehua1.bmp');subplot(2,3,1);imshow(im);title('原图');xscale=1.5;yscale=1.5;[row,col,r]=size(im);row=row*yscale; col=col*xscale;im1=uint8(zeros(uint16(row),uint16(col),uint16(r)));for i=1:rowfor j=1:colx=j/xscale; y=i/yscale;im1(i,j,1)=im(uint16(y),uint16(x),1);im1(i,j,2)=im(uint16(y),uint16(x),2);im1(i,j,3)=im(uint16(y),uint16(x),3);endendsubplot(2,3,2);imshow(im1);title('最近邻域法1.5');im2=uint8(zeros(uint16(row),uint16(col),uint16(r)));for i=2:row-1for j=2:col-1x=j/xscale; y=i/yscale;left=floor(x); top=floor(y);right=left+1; bottom=top+1;u=x-left; v=y-top;im2(i,j,1)=uint8((1-u)*(1-v)*im(top,left,1)+(1-u)*v*im(top,right,1)+...u*(1-v)*im(bottom,left,1)+u*v*im(bottom,right,1));im2(i,j,2)=uint8((1-u)*(1-v)*im(top,left,2)+(1-u)*v*im(top,right,2)+...u*(1-v)*im(bottom,left,2)+u*v*im(bottom,right,2));im2(i,j,3)=uint8((1-u)*(1-v)*im(top,left,3)+(1-u)*v*im(top,right,3)+...u*(1-v)*im(bottom,left,3)+u*v*im(bottom,right,3));endendsubplot(2,3,3);imshow(im2);title('双线性插值1.5');im=imread('hehua1.bmp');subplot(2,3,4);imshow(im);title('原图');xscale=0.8;yscale=0.8;[row,col,r]=size(im);row=row*yscale; col=col*xscale;im1=uint8(zeros(uint16(row),uint16(col),uint16(r)));for i=1:rowfor j=1:colx=j/xscale; y=i/yscale;im1(i,j,1)=im(uint16(y),uint16(x),1);im1(i,j,2)=im(uint16(y),uint16(x),2);im1(i,j,3)=im(uint16(y),uint16(x),3);endendsubplot(2,3,5);imshow(im1);title('最近邻域法0.8');im2=uint8(zeros(uint16(row),uint16(col),uint16(r)));for i=2:row-1for j=2:col-1x=j/xscale; y=i/yscale;left=floor(x); top=floor(y);right=left+1; bottom=top+1;u=x-left; v=y-top;im2(i,j,1)=uint8((1-u)*(1-v)*im(top,left,1)+(1-u)*v*im(top,right,1)+...u*(1-v)*im(bottom,left,1)+u*v*im(bottom,right,1));im2(i,j,2)=uint8((1-u)*(1-v)*im(top,left,2)+(1-u)*v*im(top,right,2)+...u*(1-v)*im(bottom,left,2)+u*v*im(bottom,right,2));im2(i,j,3)=uint8((1-u)*(1-v)*im(top,left,3)+(1-u)*v*im(top,right,3)+...u*(1-v)*im(bottom,left,3)+u*v*im(bottom,right,3));endendsubplot(2,3,6);imshow(im2);title('双线性插值0.8');5. 将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。
I=imread('hehua1.bmp');figure;subplot(1,2,1);imshow(I);title('原图');I=double(I);[m,n,l]=size(I);I1(1:m,1:n,1:l)=I(1:m,n:-1:1,1:l);I2=imrotate(I1,315,'nearest');I3=uint8(I2);subplot(1,2,2);imshow(I3);title('水平镜像顺时针旋转45度');6.将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果I=imread('hehua.bmp');[m,n,l]=size(I);figure;subplot(1,3,1);imshow(I);title('原图');I=double(I);G=zeros(m,n,l)for i=1:mfor j=1:nfor k=1:lG(i+round(sqrt(3)/3*j),j,k)=I(i,j,k);endendendsubplot(1,3,2);imshow(uint8(G));title('水平30度');G1=zeros(m,n,l)for i=1:mfor j=1:nfor k=1:lG1(i,j+i,k)=I(i,j,k);endendendsubplot(1,3,3);imshow(uint8(G1));title('垂直45度');(注:文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)。