图像到图像的映射
1.1单应性变换
单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。
0
单应性变换具有很强的实用性,比如图像配准、图像纠正和纹理扭曲,以及创建全景图像
本质上,单应性变换H,按照下边的方程映射二维中的点(齐次坐标意义下):
对于图像平面内的点,齐次坐标是一个非常有用的表示方式。点的齐次坐标是依赖于其尺度定义的,所以x=[x, y, w]=[αx, αy, αw]=[x/w, y/w,1]都表示同一个二维点。因此,单应性矩阵H也仅仅依赖尺度定义,所以单应性矩阵具有9个独立的自由度。
通常使用w=1来归一化,这样点具有唯一的图像坐标x和y,这样可以简单地使用一个矩阵来表示变换。
创建homography.py文件,使用下边的函数实现对点进行归一化和转换齐次坐标的功能:
def normalize(points):
for row in points:
row /= points[-1]
return points
def make_homog(points):
return vastack((points,ones((1,points,shape[1]))))
行点和变换处理时,我们会按照列优先的原则存储这些点。因此,n个二维点集将会存储为齐次坐标意义下的一个3 *n数组。这种格式使得矩阵乘法和点的变换操作更加容易。
在这些投影的变换中,有一些特别重要的变换。比如,仿射变换可以应用于图像扭曲、相似变换可以应用于图像配准。
1.1 直接线性变换算法
单应性矩阵可以由两幅图像中对应点对计算出来。一个完全射影变换具有8个自由度,根据对应点约束,每个对应点对可以写出两个方程,分别对应于x和y坐标。因此,计算单应性矩阵H需要4个对应点对。
DLT(直接线性变换)是给定4个或者更多对应点对矩阵,来计算单应性矩阵H的算法。将单应性矩阵H作用于对应点对上,重新写出一个齐次方程Ah=0,其中A是一个具有对应点对二倍数量行数的矩阵。将这些对应点对方程的系数堆叠到一个矩阵中,可以使用奇异值分解找到H的最小二乘解。
CODE:
def H_from_points(fp,tp):
if fp.shape != tp.shape:
raise RuntimeError('number of points do not match')
m = mean(fp[:2],axis=1)
maxstd = max(std(fp[:2],axis=1)) + 1e-9
C1 = diag([1/maxstd,1/maxstd,1])
C1[0][2] = -m[0]/maxstd
C1[1][2] = m[1]/maxstd
fp = dot(C1,fp)
m = mean(tp[:2],axis=1)
maxstd = max(std(tp[:2],axis=1)) +1e-9
C2 = diag([1/maxstd,