Opencv中的仿射变换和透射变换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010368556/article/details/82939706

OpenCV提供了一些关于透视变换的接口,例如getPerpectiveTransform, warpPerspective等。这里主要说明一下warpPerspective是如何工作的。

 其实OpenCV中很多图像变换的映射关系都是反直觉的,如这里的warpPerspective和remap函数。直觉告诉我们,这些函数的输入是原图的像素坐标,通过映射表或矩阵运算,输出的是目标图像的像素坐标。其实不然,OpenCV是先取一个目标图像的坐标,然后根据映射关系定位到原图中去,再从原图中得到该坐标的像素值。然而通过映射关系得到的坐标通常不是一个整数,即并不是原图的一个像素坐标,所以还需根据原图中该坐标周围的像素值用某些插值算法计算出该坐标应有的像素值。也就是:

映射关系

对于warpPerspective这个函数,我们已知它表示的映射关系了:

warpPerspective map

特别提醒,公式里的x,y是目标图像的坐标!那么我们设原图坐标是xo,yo,则有:

xo=(M11x+M12y+M13)/(M31x+M32y+M33)

yo=(M21x+M22y+M23)/(M31x+M32y+M33)

当我们想计算原图中某个特定的点在目标图像中的位置时,就需要解这个二元一次方程组了,解得:

x=((M22-M32yo)(M33xo-M13)-(M12-M32xo)(M33yo-M23))/((M22-M32yo)(M11-M31xo)-(M12-M32xo)(M21-M31yo))

y=((M21-M31yo)(M33xo-M13)-(M11-M31xo)(M33yo-M23))/((M21-M31yo)(M12-M32xo)-(M11-M31xo)(M22-M32yo))

扫描二维码关注公众号,回复: 4887922 查看本文章

透视变换(Perspective Transformation):是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。通用的变换公式为:

u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中
变换矩阵可以拆成4部分,表示线性变换,比如scaling,shearing和ratotion。用于平移,产生透视变换。所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)

猜你喜欢

转载自blog.csdn.net/u010368556/article/details/82939706