
2.5 图像坐标变换和应用
对图像的坐标变换实际上是对像素的坐标变换,即改变像素在图像中的位置。实际应用中,为消除图像采集中产生的几何畸变就需要用到坐标变换。
2.5.1 基本坐标变换
图像的平移、旋转和尺度变换都是基本的图像坐标变换。这里仅考虑2-D图像的坐标变换。
1. 变换的表达
图像平面上一个像素的坐标可记为(x, y),如用齐次坐标,则记为(x, y, 1)。坐标变换可借助矩阵写为

式中,v是变换前的坐标矢量:

v'是变换后的坐标矢量:

而A是一个如下形式的3×3变换矩阵(运用方矩阵可极大地简化表达):

对不同的变换,其变换矩阵唯一地确定了变换的结果。
上面讨论的是对单个像素的坐标变换,如果有一组m个像素,可让v2,v2,…,vm代表m个像素的坐标。对一个其列由这些列矢量组成的3×m矩阵V,仍可用上述3×3的矩阵A同时变换所有像素,即

输出矩阵V'仍是一个3×m矩阵,它的第i列v'i包括对应于vi的变换后像素的坐标。
2. 平移变换
平移变换改变像素的位置。设需要用平移量(tx, ty)将具有坐标为(x, y)的像素平移到新的位置(x', y'),这个平移可用矩阵形式写为

换句话说,平移变换矩阵可写为

执行反坐标变换的逆矩阵也很易推出,平移变换的逆矩阵是

3. 尺度变换
尺度变换也称放缩变换,它改变像素间的距离,对物体来说则改变了物体的尺度。尺度变换一般是沿坐标轴方向进行的,或可分解为沿坐标轴方向进行的变换。
当分别用sx和sy沿着X和Y轴进行尺度变换时,尺度变换矩阵可写为

当sx或sy不为整数时,原图像中有些像素在尺度变换后的坐标值可能不为整数,导致变换后图像中出现“孔”,此时需要进行取整操作和插值操作(参见2.5.3小节)。
尺度变换的逆矩阵是

4. 旋转变换
旋转变换改变像素间的相对方位。如果定义逆时针旋转为正,则旋转变换的矩阵是

其中θ为旋转的角度。旋转矩阵的模是1。
旋转变换的逆矩阵是

5. 变换级连
基本的坐标变换可以级连进行。连续多个变换可借助矩阵的相乘最后用一个单独的3×3变换矩阵来表示。例如,对一个坐标为v的像素的依次平移、尺度和旋转变换可表示为

式中A是一个3×3矩阵,A=RST。需要注意这些矩阵的运算次序一般不可互换。
例2.5.1 变换级连示例
实现对一个像素先平移,再旋转,最后反平移的变换矩阵为

可见,通过3个3×3矩阵连乘得到的仍是一个3×3矩阵。
2.5.2 仿射变换
仿射变换可看作对前述基本坐标变换的扩展。一般仿射变换的矩阵可写为

与平移变换矩阵相比,左上角的2×2部分由一个归一化对角矩阵变成了一个一般矩阵。一个平面上的仿射变换有6个自由度,除了2个平移自由度,还多了4个自由度。
如图2.5.1所示,用仿射变换矩阵和
对左边的多边形进行仿射变换得到的3个结果,分别如右边3个图形所示。

图2.5.1 对一个多边形图形分别进行三次仿射变换得到的结果
仿射变换的一种特例是欧氏变换,欧氏变换的矩阵可写为(θ为旋转角):

参见式(2.5.11)和式(2.5.7),欧氏变换是先旋转变换后平移变换的组合。平面上的欧氏变换只有3个自由度。图2.5.2所示的是分别用θ=−90°和t=[2, 0]T、θ=90°和t=[2, 4]T、θ=0°和t=[4, 6]T定义的欧氏变换对左边的多边形图形进行欧氏变换得到的结果。

图2.5.2 对一个多边形图形分别进行三次欧氏变换得到的结果
如果对欧氏变换矩阵中的旋转变换矩阵乘一个大于0的各向同性的放缩系数s,则得到相似变换矩阵:

相似变换也是仿射变换的一种特例,但有4个自由度,比欧氏变换更一般化。图2.5.3所示的分别是出用s=1.5、θ=−90°和t=[1, 0]T,s=1、θ=180°和t=[4, 8]T,s=0.5、θ=0°和t=[5, 7]T定义的相似变换对左边的多边形图形进行相似变换得到的3个结果。

图2.5.3 对一个多边形图形分别进行三次相似变换得到的结果
2.5.3 几何失真校正
对图像的几何失真校正是坐标变换的一种具体应用。在许多实际的图像采集处理过程中,图像中像素之间的空间关系会发生变化。典型的例子如显示器上出现的枕形或桶形,倾斜投影造成景物各部分比例失调等。此时,可以说图像产生了几何失真或几何畸变。换句话说,原始场景中各部分之间的空间关系与图像中各对应像素间的空间关系不一致了。这时需要通过几何变换来校正失真图像中的各像素位置以重新得到像素间原来应有的空间关系。对灰度图像,除了考虑空间关系还要考虑灰度关系,即同时需要进行灰度校正以还原本来像素的灰度值。
设原图像为f(x, y),受到几何失真的影响变成g(x', y')。对几何失真的校正既要根据(x, y)和(x',y')的关系由(x', y')确定(x, y),也要根据f(x, y)和g(x', y')的关系由g(x', y')确定f(x, y)。这样对图像的几何失真校正主要包括两个步骤:空间变换和灰度插值。下面将依次介绍。
1. 空间变换
空间变换的目标是对图像平面上的像素进行重新排列以恢复像素之间原来应有的空间关系。设一个像素的原坐标为(x, y),几何形变后失真像素的坐标为(x', y'),则它们的关系为

其中s(x, y)和t(x, y)分别代表产生几何失真图像的两个空间变换函数。最简单的情况是线性失真,此时s(x, y)和t(x, y)可写为

对一般的(非线性)二次失真,s(x, y)和t(x, y)可写为

如果知道s(x, y)和t(x, y)的解析表达,那就可以通过反变换来恢复图像。在实际应用中通常不知道失真情况的解析表达,为此需要在校正过程的输入图(失真图)和输出图(校正图)上找一些确切知道其位置的点(称为约束对应点),然后利用这些点的信息按照失真模型计算出失真函数中的各个系数,从而建立两幅图像间其他像素在空间位置上的对应关系。
现在来看图2.5.4,它所示的是一个在失真图上的四边形区域和在校正图上与其对应的四边形区域。这两个四边形区域的顶点可作为对应点。

图2.5.4 失真图和校正图的对应点
设在四边形区域内的几何失真过程可用一对双线性等式表示(是一般非线性二次失真的一种特例),即

将以上两式分别代入式(2.5.17)和式(2.5.18),就可得到失真前后两图坐标间的关系:

由图2.5.4可知两个四边形区域之间共有4组(8个)已知对应点,所以上面两式中的8个系数ki(i=1, 2, …, 8)可以全部解得。利用这些系数可建立将四边形区域内的所有点都进行空间映射的公式。一般来说,可将一幅图分成一系列覆盖全图的四边形区域的集合,对每个区域都找出足够的对应点以计算进行映射所需的系数。如能做到这点,就很容易得到校正图了。
2. 灰度插值
灰度插值的目标是对空间变换后的像素赋予相应的灰度值以恢复原位置的灰度值。尽管实际数字图像中的(x, y)总是整数,但由式(2.5.25)和式(2.5.26)算得的(x', y')值一般不是整数,即空间变换后的像素坐标常常不是整数。由于失真图像g(x', y')是数字图像,其像素值仅在其坐标为整数处有定义,所以在非整数处的像素值就需要借助其周围一些整数处的像素值来计算,这就是灰度插值,可借助图2.5.5来解释。图2.5.5中左部是理想的原始不失真图,右部是实际采集的失真图。几何校正就是要把失真图恢复成原始图。由于失真,原图中整数坐标点(x, y)会映射到失真图中的非整数坐标点(x', y'),而g在该点是没有定义的。前面讨论的空间变换可将应在原图(x, y)处的(x', y')点变换回原图(x, y)处。现在要做的是估计出(x', y')点的灰度值,并将其赋给原图(x, y)处的像素。

图2.5.5 灰度插值示意图
灰度插值在实现时可以有两种方案。一种方案考虑把从实际采集到的失真图像的像素值赋给原始不失真图的像素。如图2.5.6(a)所示,左部是实际采集的失真图,右部是理想的原始不失真图。如果一个失真图的像素映射到不失真图的4个像素之间(非整数点),则将失真图像素的灰度根据插值算法分别分配给不失真图的那4个像素,这种方法称为前向映射。另一种方案考虑把灰度从原始的不失真图中映射到实际采集的失真图像素上。如图2.5.6(b)所示,左部是实际采集的失真图,右部是理想的原始不失真图。如果实际采集失真图中的位置对应不失真图的4个像素之间(非整数点),则先根据插值算法计算出该位置的灰度,再将其映射给不失真图的对应像素,这种方法称为后向映射。

图2.5.6 前向映射和后向映射
由于在前向映射中,有一定数量的失真图的像素有可能会映射到不失真图之外,所以有些计算方面的浪费。另外,不失真图中的许多像素的最后灰度是由许多失真图像素的贡献之和决定的,这也需要较多的寻址,特别是在采取高阶插值时。相对来说后向映射效率比较高。不失真图是逐个像素得到的,每个像素的灰度是由一步插值确定的,所以后向映射实际上用得更广泛。
对插值灰度的计算方法有许多种。最简单的是最近邻插值,也称为零阶插值。最近邻插值就是将离(x', y')点最邻近像素的灰度值作为(x', y')点的灰度值赋给原图(x, y)处的像素(参见图2.5.5)。这种方法计算量小,但缺点是有时不够精确。
为提高精度,可采用双线性插值。它利用(x', y')点的4个最近邻像素的灰度值来计算(x', y')点处的灰度值。如图2.5.7所示,设(x', y')点的4个最近邻像素为A,B,C,D。它们的坐标分别为(i, j),(i+1, j),(i, j+1),(i+1, j+1)。它们的灰度值分别为g(A),g(B),g(C),g(D)。

图2.5.7 双线性插值示意图
首先计算E和F这2点的灰度值g(E)和g(F):

则(x', y')点的灰度值g(x', y')为

如需要更高的精度,还可采用三次线性插值方法。它利用点(x', y')的16个最近邻像素的灰度值,根据下面方法计算点(x', y')处的灰度值。如图2.5.8所示,设点(x', y')的16个最近邻像素为A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,则计算点(x', y')的插值公式为

其中Wx为横坐标插值的加权值,Wy为纵坐标插值的加权值,分别计算如下:
(1)如果g(·)的横坐标值与x'的差值dx小于1(即B,C,F,G,J,K,N,O),则

(2)如果g(·)的横坐标值与x'的差值dx大于等于1(即A,D,E,H,I,L,M,P),则

(3)如果g(·)的纵横坐标值与y'的差值dy小于1(即E,F,G,H,I,J,K,L),则

(4)如果g(·)的纵坐标值与y'的差值dy大于等于1(即A,B,C,D,M,N,O,P),则


图2.5.8 三次线性插值方法