Python计算机视觉编程
图像到图像的映射
(一)单应性变换
定义:单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。在这里,平面是指图像或者三维中的平面表面。单应性变换具有很强的实用性,比如图像配准、 图像纠正和纹理扭曲,以及创建全景图像。我们将频繁地使用单应性变换。本质上, 单应性变换 H,按照下面的方程映射二维中的点(齐次坐标意义下):
对于图像平面内的点,齐次坐标是个非常有用的表示方式。点的齐次坐标是依赖于其尺度定义的,所以 x=[x,y,w]=[αx,αy,αw]=[x/w,y/w,1] 都表示同一个二维点。因此,单应性矩阵H 也仅依赖尺度定义,所以,单应性矩阵具有 8 个独立的自由度。我们通常使用 w=1 来归 一化点,这样,点具有唯一的图像坐标 x 和 y。这个额外的坐标使得我们可以简单地使用一个矩阵来表示变换。
矩阵H会将一幅图像上的一个点的坐标a=(x,y,1)映射成另一幅图像上的点的坐标b=(x1,y1,1),也就是说,我们已知a和b,它们是在同一平面上。 则有下面的公式:
即:
得:
得:
对于方程:
可写成一个矩阵与一个向量相乘,即:
其中,
是一个9维的列向量,若令:
则
可记为
这里的
这只是1对点所得到的矩阵A,若有4对点,则得到的矩阵:
由于我们是采用齐次坐标(即(x,y,1))来表示平面上的点,所以存在一个非零的标量s,使得 b 1 b_1 b1=sH a T a^T aT与b=sH a T a^T aT都表示同一个点b。若令
则:
可以看出,其实H只有8个变量(8个自由度)。因此,只需要4个点对,然后通过解线性方程组就可以求得H。也可以多于4个点对。
假设有n≥4个点对,则得到的矩阵:
求解向量h,直接对A进行SVD分解,即
然后取V的最后一列出来作为求解h。因为矩阵A是行满秩,即只有一个自由度。具体实现时,先要得到两幅图,然后在两幅图之间找到4对点的坐标,由此得到矩阵A。
1.1 直接线性变换算法
DLT(Direct Linear Transformation,直接线性变换)是给定4个或者更多对应点对矩阵,来计算单应性矩阵 H 的算法。
我们首先讨论由给定2D到4D的四组点对应
确定H的直接线性算法。变换由方程
给出。注意这是一个齐次矢量方程;因此3维矢量 X i X_i Xi’和H X i X_i Xi不相等,它们有相同的方向,但在大小上可能相差一个非零因子。该等式可以用矢量叉乘:
表示,由该表示式可推出H的一个简单线性解。
如果将矩阵H的第j行记为 h j T h^jT hjT,那么:
记
则叉积可以显示地写成:
因为对j=1,2,3,
皆成立,这就给出关于H元素的三个方程,并可以写成下列形式:
这些方程都有 A i A_i Aih=0的形式,其中 A i A_i Ai是3x9的矩阵,h是由矩阵H的元素组成的9维矢量。
其中 h i h_i h