计算机视觉——图像到图像的映射
一、基本原理
1、单应性变换
将平面内一个点映射到另一个平面内的二维投影变换。单应性矩阵H具有8个独立的自由度,其中h33=1。H的求解在代码中的Haffine_from_points(在homography.py中)
单应性矩阵可以由两幅图像中对应点计算出来。然后我们再得到坐标的变换公式。
矩阵H会将一幅图像上的一个点的坐标a=(x,y,1)映射成另一幅图像上的点的坐标b=(x1,y1,1),也就是说,我们已知a和b,它们是在同一平面上,代码里是将fp对应到tp(映射目标点)。 则有下面的公式(1):
即:
由上面的公式中的③可以得到坐标变换的公式:
继续得:
根据前面式子(1),可写成一个矩阵与一个向量相乘,即得到式子(2):
其中,h=[h11,h12,h13,h21,h22,h23,h31,h32,h33]^T,是一个9维的列向量。若令:
然后又几对匹配特征就会几个A矩阵,n为匹配特征的对数,单应性矩阵有里8个自由度,至少需要4对(且要求三点不共线,所以这里选择四边形的四个顶点)
则式子(2)可记做:
我们把矩阵A的SVD定义为
V的最后一行是h的一个解,即有两个解
2、仿射变换
一种二维坐标到二维坐标之间的线性变换(相同平面),它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),但是角度会改变。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
单应性变换有8个自由度,仿射有6个自由度,我们令H矩阵的 h31=h32=0,即:
仿射变换具有6个自由度,因此我们需要三个对应点来估计矩阵H。
典型的仿射变换有:
(1)平移,将每一点移到到(x+t , y+t),变换矩阵为
(2)缩放变换 将每一点的横坐标放大或缩小sx倍,纵坐标放大(缩小)到sy倍,变换矩阵为:
(3)旋转变换原点:目标图形围绕原点顺时针旋转Θ 弧度,变换矩阵为:
(4) 旋转变换 :目标图形以(x , y )为轴心顺时针旋转θ弧度,变换矩阵为:
相当于两次平移与一次原点旋转变换的复合,即先将轴心(x,y)移到到原点,然后做旋转变换,最后将图片的左上角置为图片的原点,即:
3、代码
#对点进行归一化
#映射起始点
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, 1/maxstd, 1])
C2[0][2] = -m[0]/maxstd
C2[1][2] = -m[1]/maxstd
tp = dot(C2<