在计算机图像学中常常涉及到对图像的进行各种变换,包括平移、旋转、缩放、剪切等操作,它们被称为坐标变换或仿射变换。本篇文章将由浅到深,详细地讨论关于图像坐标变换的原理。
1、二维坐标变换
在本篇文章中,我们重点来讨论二维图像和三维图像的坐标变换。为了更好去理解三维坐标变换,我们先讨论二维坐标变换。
1.1、二维平移(Translation)
点分别向和方向平移和个单位:
图1:点P经过平移后得到点P'
经过上述的平移之后,得到:
如果我们将点的坐标用矩阵的方式来表示,则可以得到:
我们是否可以将式子(2)拆开成为原坐标向量和平移变换矩阵的乘法?然而,根据线性代数的基础知识可知,无法将(2)进行拆分。(读者可以动手试一试,看能不能拆开。至于为什么要拆开,我们将在后面讨论)
为了将式子(2)拆开,我们就必须引入齐次坐标。齐次坐标无非就是将二维的矩阵变为三维,并在第三维用数字1来填充:
此时我们就可以拆开式子(3)用矩阵和向量的乘法来表示:
为了更加简便,我们将(4)继续化简:
其中为单位矩阵,为平移的向量。任意一点坐标左乘平移矩阵就可以得到平移后的位置。
1.2、二维缩放(Scale)
点的轴分别缩放倍:
图2:对P点进行缩放
坐标的向量形式:
将(6)拆分为坐标向量和缩放矩阵的乘法:
为缩放矩阵,点的位置向量左乘缩放矩阵便可得到缩放后的点。
1.3、三维旋转(Rotation)
向量旋转角度到:
图3:P点旋转至点P’
和表示为:
就是向量的长度。
展开:
将上述表达式用矩阵来表示:
角度后的新坐标。
读者可能会注意到,上述的旋转只是二维坐标围绕着坐标原点进行旋转,那关于任意点旋转应该如何表示?其实关于任意点的旋转操作可以拆分为以下步骤:①将旋转点移动到坐标原点;②按绕原点的旋转规律进行旋转;③再将旋转点移回原处。
图4:任意点的二维旋转可拆分为平移+旋转
2、三维坐标变换
2.1、三维平移(Translation)
向三个方向分别平移个单位:
图5:点P的三维平移操作
的平移向量为:
为了拆分平移操作为向量和矩阵的乘法,我们仍然引入了齐次坐标。那么可表示为:
为平移矩阵。
2.2、三维缩放(Scale)
向三个方向分别缩放倍时,坐标的向量形式为:
将(12)进行拆分:
就是缩放矩阵,任意三维坐标左乘就可以得到缩放之后的新坐标。
2.3、三维旋转(Rotation)
指向右方,指向上方,指向前方,如图(6)所示:
图6:右手坐标系
三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,在本节我们考虑绕X、Y、Z轴的旋转。
2.3.1、绕X轴旋转
轴旋转,则把图(6)中的整个坐标系向右旋转,让轴指向前方。绕轴旋转,则不用考虑轴的坐标变化,三维坐标变为了二维坐标,就构成了一个二维平面(为坐标原点):
图7:绕X轴旋转的右手坐标系
轴就是原来的轴,轴也就是原来的轴,因此根据二维坐标的旋转可得:
(15)的矩阵形式:
注意:为了与平移的矩阵形式相同,旋转矩阵也采用了齐次坐标。
2.3.2、绕Y轴旋转
轴旋转,则把图(6)中的整个坐标系向左旋转,让轴指向前方。绕轴旋转,则不用考虑轴的坐标变化,三维坐标变为了二维坐标,就构成了一个二维平面(为坐标原点):
图8:绕Y轴旋转的右手坐标系
轴就是原来的轴,轴也就是原来的轴,因此根据二维坐标的旋转可得:
用矩阵形式来表示式子(16):
2.3.3、绕Z轴旋转
轴旋转,则让轴指向前方。绕轴旋转,则不用考虑轴的坐标变化,三维坐标变为了二维坐标,就构成了一个二维平面(为坐标原点):
图9:绕Z轴旋转的右手坐标系
轴旋转,其实就是二维坐标绕原点旋转,因此可推出:
(19)用矩阵表示:
3、注意
3.1、为什么要用齐次坐标?
在图像处理中,我们往往不是单一地对某一坐标进行变换操作,而是会对大量的坐标进行一系列的变换操作。如果直接使用表达式的形式来进行变换操作也是可行的,但是这其中涉及大量的计算,而叠加各种变换系数后的表达式将变得十分臃肿且会降低程序的计算效率。
解决办法就是将各种变换操作用一个单独的矩阵来进行表示,列如:
(21)表示对三维坐标先进行平移,然后缩放,最后再旋转等一系列操作,其中是旋转矩阵,是缩放矩阵,是平移矩阵。
采用矩阵形式来表达变换操作有如下好处:①可以更简便地表示变换操作;②矩阵形式非常利于计算机处理,可以加快计算效率。
正是基于以上的原因,所以我们需要将变换操作都统一用矩阵的形式来表示。
读者可以发现:无论是二维坐标的平移还是三维坐标的平移都无法直接用矩阵形式来表示,这也是为什么我们要引入齐次坐标的原因。二维坐标通过引入齐次坐标变成三维坐标,从而可以很轻松地使用矩阵形式来表示平移操作;三维坐标则通过引入齐次坐标变为四维坐标,用四维坐标方式来描述三维的平移操作。
3.2、在三维坐标中,如何用矩阵形式来表示绕X、Y、Z的负方向进行旋转?
在2.3节中,从可以看出,我们只考虑了向正方向进行旋转,想要考虑负方向的旋转则只需要即可,可以表示为,然后再化解表达式,求出沿负方向的变换矩阵。
4、总结
我们在讨论二维坐标变换的基本原理之后,将二维坐标变换的理论迁移到三维坐标变换,并深入讨论关于三维坐标变换的基础原理。我们细致地解释了用变换矩阵的形式来代替变换表达式以及引入齐次坐标的原因。在最后,我们探讨了如何用矩阵形式来表示沿坐标轴的负方向进行旋转变换。