图像几何变换基础
我们实际获取的图像,常常因为各种原因,相对于原图有一定的几何形变,或者出于处理考虑,需要进行几何变换。二维图像坐标的几何变换写为: (x′,y′)=r(x,y) 。根据图像几何变换的程度,可以将图像几何变换划分为如下几类:
- 刚体变换 如果一幅图像中的两点间的距离经变换到另一幅图像中后仍然保持不变,则这种变换称为刚体变换(Rigid Transform)。刚体变换仅局限于平移、旋转和反转(镜像)。
- 仿射变换 如果一幅图像中的直线经过后映射到另一幅图像上仍为直线,并且保持平行关系,则这种变换称为仿射变换(Affine Transform。仿射变换适应于平移、旋转、缩放和反转(镜像)情况。
- 投影变换 如果一幅图像中的直线经过后映射到另一幅图像上仍为直线,但平行关系基本不保持,则这种变换称为投影变换(Projective Transform )。
- 非线性变换 非线性变换又称为弯曲变换(Curved Transform)或者弹性变换,经过非线性变换,一幅图像上的直线映射到另一幅图像上不一定是直线,可能是曲线。
广义来讲,非线性变换包含投影变换;投影变换包含仿射变换;仿射变换包含刚体变换。非线性变换下,新旧坐标的一类简单的表达式写为:
⎧⎩⎨⎪⎪x′ky′kw′k=a11xmk+a12xm−1kyk+...a1mymk+a1wk=a21xmk+a22xm−1kyk+...a2mymk+a2wk=a31xmk+a32xm−1kyk+...a3mymk+a3wk,n=1,2,3...(1)
在投影变换范围下,新旧坐标的变换呈线性,表达式较为简单:
⎧⎩⎨⎪⎪x′ky′kw′k=a1xk+a2yk+a3wk=a4xk+a5yk+a6wk=a7xk+a8yk+a9wk,k=1,2,3...n(2)
same as ⎡⎣⎢⎢⎢⎢⎢⎢x′1x′2x′3...x′ny′1y′2y′3y′nw′1w′2w′3w′n⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢a1a4a7a2a5a8a3a6a9⎤⎦⎥⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢x1x2x3...xny1y2y3ynw1w2w3wn⎤⎦⎥⎥⎥⎥⎥⎥→B=AX(3)
A称为空间变换矩阵。其中 [a1a4a2a5] 控制旋转、缩放和斜切, [a7a8] 控制平移, [a3a6] 控制透视变换;w是归一化因子,要求 w′k 和 wk 都是1,在特殊情况下为了便于分析可以不为1。三维图像空间变换同理,扩展出z变量,组成一个 4×4 的变换矩阵即可。
如果我们知道需要做何种变换,直接在单位空间变化矩阵上修改相应系数即可;如果我们不知道图像相比原图像做了什么变换,那么就需要设法获取图像的变换信息。常见的方法是手工标记前后两幅图像中的对应特征点,根据特征点的变换来计算得到变换的矩阵。
我这里的计算限制于透视变换,或者非弹性变换。当我们获取足够的变换特征点信息,就可以计算变换矩阵,方法是求解(2)式中的系数矩阵A。这里单独看方程式很像求解多元一次方程组,但是多元一次方程组求解的是x,y而不是系数;求解系数矩阵的一个著名方法,前面在 【机器学习】线性回归小结提到,即最小二乘法。
假设我要变换一个256x256的图像,目标图像的四个边角坐标为(0,0),(180,75),(255,255),(75,180)。由于图像通常是方形的,因此四个边角点可以作为变换特征点。在《数字图像处理》书中,对四边形的空间变换使用了双线性方程来描述,这里我们直接使用空间变换矩阵,写成:
⎡⎣⎢⎢⎢⎢0180255750752551801111⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢a1a4a7a2a5a8a3a6a9⎤⎦⎥⎥⋅⎡⎣⎢⎢⎢⎢02552550002552551111⎤⎦⎥⎥⎥⎥
用最小二乘法得到
A≈⎡⎣⎢⎢0.7060.29400.2940.7060001⎤⎦⎥⎥
原图
变换后