一、图像到图像的映射
图像映射的基本类型:
- translation(位移)
- rotation(旋转)
- scale(尺度/大小)
- affine(仿射)
- Perspective(透视)
- 刚体变换:平移+旋转,只改变物体位置,不改变物体形状
- 仿射变换:改变物体位置和形状,但是保持“平直性”(即变换后直线还是直线不会打弯,圆弧还是圆弧)
- 投影变换:彻底改变物体位置和形状
二、单应性变换
定义:单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。在这里,平面是指图像或者三维中的平面表面。单应性变换具有很强的实用性,比如图像配准、 图像纠正和纹理扭曲,以及创建全景图像。我们将频繁地使用单应性变换。本质上, 单应性变换 H H H,按照下面的方程映射二维中的点(齐次坐标意义下):
对于图像平面内的点,齐次坐标是个非常有用的表示方式。点的齐次坐标是依赖于其尺度定义的,所以 x = [ x , y , w ] = [ α x , α y , α w ] = [ x / w , y / w , 1 ] x=[x,y,w]=[αx,αy,αw]=[x/w,y/w,1] x=[x,y,w]=[αx,αy,αw]=[x/w,y/w,1]都表示同一个二维点。因此,单应性矩阵 H H H也仅依赖尺度定义,所以,单应性矩阵具有 8 个独立的自由度。
我们通常使用 w = 1 w=1 w=1来归一化点,这样,点具有唯一的图像坐标 x x x和 y y y 。这个额外的坐标使得我们可以简单地使用一个矩阵来表示变换。
根据对应点约束,每个对应点可以写出两个方程,分别对应于 x 和 y 坐标。因此,计算单应性矩阵 H 需要4个对应点对
对点进行归一化和转换齐次坐标的功能:
def normallize(points):
"""在齐次坐标意义下,对点集进行归一化,是最后一行为1"""
for row in points:
row /= points[-1]
return points
def make_homog(points):
"""将点集(dim×n的数组)转换为齐次坐标表示"""
return vstack((points,ones((1, points.shape[1]))))
2.1 直接线性变换算法
DLT(Direct Linear Transformation,直接线性变换)是给定4个或者更多对应点对 矩阵,来计算单应性矩阵 H H H的算法。将单应性矩阵 H H H作用在对应点对上,重新写出该方程,我们可以得到下面的方程:
或者 A h = 0 Ah=0 Ah=0,其中 A A A 是一个具有对应点对二倍数量行数的矩阵。将这些对应点对方程的系数堆叠到一个矩阵中,我们可以使用 SVD(Singular Value Decomposition, 奇异值分解)算法找到 H H H 的最小二乘解。
def H_from_points(fp