仿射变换是投射变换的一个特例
仿射变换:6参数
投射变换:8参数
仿射变换:包括线性变换(旋转、剪切、缩放)及平移;特点:平行的线变换后依然保持平行。任意的仿射变换都能表示为乘一个矩阵(线性变换),再加一个向量 (平移) 的形式.
透射变换:利用透视中心、像点、目标点三点共线原理,从一个平面投影到另一个视平面。特点:投影变换后的线不一定保持平行,对图形的扭曲能力更强。也被称为投影变换、共线性或单应性
一、仿射变换
1、概念
仿射变换(Affine Transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
图1.仿射变换
2、仿射变换的变换公式推导
在opencv提供的仿射变换中,变换的公式是一个2*3的矩阵,如下:
,,
A是仿射变换2*3矩阵,M是2*2矩阵,表示坐标轴的旋转和缩放,B是2*1矩阵,是坐标轴平移矩阵。
坐标变换如下:
,
可以看出,A矩阵只有6个参数,所以只要知道3个点之间的仿射变换,就可以求出A矩阵。
二、透视变换
透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
图2.透视变换
透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。通用的变换公式为:
u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中。
变换矩阵可以拆成4部分,表示线性变换,比如scaling,shearing和ratotion。用于平移,产生透视变换。所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)。
重写之前的变换公式可以得到:
所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能新的变换后的图片。简单的看一个正方形到四边形的变换:
变换的4组对应点可以表示成:
根据变换公式得到:
定义几个辅助变量:
都为0时变换平面与原来是平行的,可以得到:
不为0时,得到:
求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形。
所以,我们可以发现仿射变换就是特殊的透射变换,这里我们在理解它们的变换矩阵时一定要将矩阵分部分析,比如之前的一部分是用来旋转和缩放,一部分是用来平移,还有一部分是用来透射;
之前的(x , y , w)中,w的意义我觉得它就是指投影点到面上的“距离”,这里之所以打引号我个人认为它不是物理距离,更多的带有一种数学上的“单位1”的意义;
两者异同:
所以对于仿射变换,一般地w = w' , 也就是依然是这个平面,所以就相当于一个2D平面变换(忽略了投影点);
对于透射变换,一般的w' = f(w) , f即相应的透射变换,所以这里就是投影点通过这个面投射到另一个承影面,这里投影点就显示了它的功能,所以我们说仿射变换是特殊的透射变换;
OpenCV还提供了getPerspectiveTransform()函数及findHomography()的函数两个函数寻找变换公式,前者用点来找,后者直接用透视平面来找变换公式。