图像处理之 _ 仿射变换与透视变换

1. 仿射变换

1) 用途

旋转 (线性变换),平移 (向量加).缩放 (线性变换),错切,反转

2) 方法

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵 (线性变换),再加上一个向量 (平移) 的形式.

图片.png

以上公式将点 (x,y) 映射到 (x’,y’),在 OpenCV 中通过指定一个 2x3 矩阵实现此功能(公式中的 m 矩阵,是线性变换和平移的组合,m11,m12,m21,m22 为线性变化参数,m13,m23 为平移参数,其最后一行固定为 0,0,1,因此,将 3x3 矩阵简化为 2x3)

3) 举例

  1. 以原点为中心旋转,2x3 矩阵为:
1
2
3
4
5
[ cos(theta), -sin(theta), 0 ],
[ sin(theta), cos(theta), 0 ]

x’ = x * cos(theta) - sin(theta) * y
y’ = x * sin(theta) + cos(theta) * y
  1. 平移,2x3 矩阵为
1
2
3
4
5
[1,0,tx],
[0,1,ty]

x’ = x * 1 + y * 0 + tx = x + tx
y’ = x * 0 + y * 1 + ty = y + ty

4) 具体应用

在 OpenCV 中,仿射变换通过函数 cvWrapAffine(src,dst,mat) 实现,其中 mat 是 2x3 的仿射矩阵,该矩阵可以利用函数 cvGetAffineTransform(srcTri,dstTri,mat) 得到,其中 mat 是被该函数填充的仿射矩阵,srcTri 和 dstTri 分别是由三个顶点定义的平行四边形(由于是平行四边形,只需要指定三个顶点即可确定),即:给出变换前的 ABCD 和变换后的 A’B’C’D’

图片.png

2. 透视变换(投影变换)

1) 用途

将 2D 矩阵图像变换成 3D 的空间显示效果,全景拼接.

2) 方法

透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维 (X,Y,Z),再到另一个二维 (x’,y’) 空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个 3x3 的矩阵,矩阵的前两行与仿射矩阵相同 (m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换.

图片.png

以上公式设变换之前的点是 z 值为 1 的点,它三维平面上的值是 x,y,1,在二维平面上的投影是 x,y,通过矩阵变换成三维中的点 X,Y,Z,再通过除以三维中Z轴的值,转换成二维中的点 x’,y’.从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间(而不是另一个二维空间).

3) 具体应用

在 OpenCV 中,透视变换通过函数 cvWrapPerspective(src,dst,mat) 实现, 与仿射变换不同的是,透视矩阵是一个 3x3 的矩阵,在计算矩阵时,可利用函数 cvGetPerspectiveTransform(srcQuad,dstQuad,mat),由于不再是平行四边形,需要提供四边形的四个顶点

图片.png

3. 区别

仿射变换后平行四边形的各边仍操持平行,透视变换结果允许是梯形等四边形,所以仿射变换是透视变换的子集