【OpenCV3图像处理】仿射变换 透视变换

图像处理的仿射变换和透视变换

仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”。一个是二维坐标(x,y),一个是三维坐标(x,y,z)

仿射变换:二维平面的变换 ; 线性变换 ;已知3对坐标点就可以求得变换矩阵

透视变换:三维空间的变换 ; 非线性变换 ;已知4对坐标点可以求得变换矩阵

仿射变换(affine transformation)

仿射变换是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
用公式可以表示为:

q⃗ =Ap⃗ +b⃗ 

其中,p为变换前原始向量,q为变换后目标向量,A为线性变换矩阵,b为平移变换向量。公式可统一写成矩阵形式以方便计算:
[q⃗ 1]=[A0b⃗ 1][p⃗ 1]

在图像处理中,我们所谓的向量是二维坐标(x,y),所以向量p、q可以如下表示:

q⃗ =[xy]p⃗ =[xy]

因此我们又能将上述矩阵改写成:
xy1=a1a30a2a40b1b21xy1

其中
T=a1a30a2a40b1b21,A=[a1a3a2a4],b=[b1b2]

T矩阵只有6个参数,所以只要知道3个点对的对应坐标,就可以求出T矩阵,也就得到A矩阵和b向量。

仿射变换也可以看成坐标系的旋转和缩放以及平移:

【OpenCV3图像处理】仿射变换 透视变换_第1张图片

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)。通用的变换公式为:
【OpenCV3图像处理】仿射变换 透视变换_第2张图片
变换矩阵可以拆成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。

参考:
作者:ruiruige1991
恋上蛋炒面的专栏

你可能感兴趣的:(opencv,图像处理,opencv,图像处理,三维)