图像处理的仿射变换和透视变换
仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”。一个是二维坐标(x,y),一个是三维坐标(x,y,z)
仿射变换:二维平面的变换 ; 线性变换 ;已知3对坐标点就可以求得变换矩阵
透视变换:三维空间的变换 ; 非线性变换 ;已知4对坐标点可以求得变换矩阵
仿射变换(affine transformation)
仿射变换是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
用公式可以表示为:
其中,p为变换前原始向量,q为变换后目标向量,A为线性变换矩阵,b为平移变换向量。公式可统一写成矩阵形式以方便计算:
在图像处理中,我们所谓的向量是二维坐标(x,y),所以向量p、q可以如下表示:
因此我们又能将上述矩阵改写成:
其中
T矩阵只有6个参数,所以只要知道3个点对的对应坐标,就可以求出T矩阵,也就得到A矩阵和b向量。
仿射变换也可以看成坐标系的旋转和缩放以及平移:
P点位置不变,坐标系由(Xt,Yt)变换到(Xs,Ys),相应的坐标有(Xtp,Ytp)变换成(Xsp,Ysp)。
其中(Xtp,Ytp)与(Xsp,Ysp)的关系如下:
OpenCV3中相应的函数:
estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变。
getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6.
warpAffine():对输入图像进行仿射变换
透视变换(Perspective transformation)
透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。通用的变换公式为:
变换矩阵可以拆成4部分,表示线性变换,比如scaling,shearing和ratotion。用于平移,产生透视变换。所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)。
OpenCV3中相应的函数:
findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 。
getPerspectiveTransform():计算4个二维点对之间的透射变换矩阵 H(3行x3列)
warpPerspective(): 对输入图像进行透射变换
perspectiveTransform():对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换。
estimateAffine3D:计算多个三维点对之间的最优三维仿射变换矩阵H (3行x4列)
transform():对输入的N维矢量进行变换,可用于进行仿射变换、图像色彩变换.
findFundamentalMat:计算多个点对之间的基矩阵H。