在计算机图像学中常常涉及到对图像的进行各种变换,包括平移、旋转、缩放、剪切等操作,它们被称为坐标变换或仿射变换。本篇文章将由浅到深,详细地讨论关于图像坐标变换的原理。

1、二维坐标变换

        在本篇文章中,我们重点来讨论二维图像和三维图像的坐标变换。为了更好去理解三维坐标变换,我们先讨论二维坐标变换。

1.1、二维平移(Translation)

图片坐标python 图片坐标转换_图片坐标python点分别向图片坐标python 图片坐标转换_坐标变换_02图片坐标python 图片坐标转换_图像处理_03方向平移图片坐标python 图片坐标转换_图像处理_04图片坐标python 图片坐标转换_齐次坐标_05个单位:


图片坐标python 图片坐标转换_图像处理_06

图1:点P经过平移后得到点P'

图片坐标python 图片坐标转换_图片坐标python经过上述的平移之后,得到图片坐标python 图片坐标转换_二维_08
图片坐标python 图片坐标转换_图片坐标python_09
        如果我们将点图片坐标python 图片坐标转换_二维_08的坐标用矩阵的方式来表示,则可以得到:
图片坐标python 图片坐标转换_二维_11

        我们是否可以将式子(2)拆开成为原坐标向量和平移变换矩阵的乘法?然而,根据线性代数的基础知识可知,无法将(2)进行拆分。(读者可以动手试一试,看能不能拆开。至于为什么要拆开,我们将在后面讨论)

        为了将式子(2)拆开,我们就必须引入齐次坐标。齐次坐标无非就是将二维的矩阵变为三维,并在第三维用数字1来填充:

图片坐标python 图片坐标转换_图片坐标python_12

        此时我们就可以拆开式子(3)用矩阵和向量的乘法来表示:

图片坐标python 图片坐标转换_二维_13

        为了更加简便,我们将(4)继续化简:

图片坐标python 图片坐标转换_二维_14
        其中图片坐标python 图片坐标转换_图像处理_15为单位矩阵,图片坐标python 图片坐标转换_齐次坐标_16为平移的向量图片坐标python 图片坐标转换_坐标变换_17。任意一点坐标图片坐标python 图片坐标转换_图像处理_18左乘平移矩阵就可以得到平移后的位置图片坐标python 图片坐标转换_二维_08

1.2、二维缩放(Scale)

图片坐标python 图片坐标转换_图片坐标python点的图片坐标python 图片坐标转换_二维_21轴分别缩放图片坐标python 图片坐标转换_坐标变换_22倍:


图片坐标python 图片坐标转换_图像处理_23

图2:对P点进行缩放

图片坐标python 图片坐标转换_二维_08坐标的向量形式:

图片坐标python 图片坐标转换_二维_25

        将(6)拆分为坐标向量和缩放矩阵的乘法:

图片坐标python 图片坐标转换_二维_26

图片坐标python 图片坐标转换_图片坐标python_27为缩放矩阵,图片坐标python 图片坐标转换_图片坐标python点的位置向量左乘缩放矩阵图片坐标python 图片坐标转换_图片坐标python_27便可得到缩放后的点图片坐标python 图片坐标转换_二维_08

1.3、三维旋转(Rotation)

图片坐标python 图片坐标转换_图像处理_31向量旋转图片坐标python 图片坐标转换_图片坐标python_32角度到图片坐标python 图片坐标转换_二维_33


图片坐标python 图片坐标转换_图像处理_34

图3:P点旋转至点P’

图片坐标python 图片坐标转换_图片坐标python图片坐标python 图片坐标转换_二维_08表示为:
图片坐标python 图片坐标转换_图像处理_37

图片坐标python 图片坐标转换_二维_38就是向量图片坐标python 图片坐标转换_齐次坐标_39的长度。

图片坐标python 图片坐标转换_图片坐标python_40展开:

图片坐标python 图片坐标转换_图像处理_41

        将上述表达式用矩阵来表示:

图片坐标python 图片坐标转换_二维_42

图片坐标python 图片坐标转换_图片坐标python_32角度后的新坐标。

        读者可能会注意到,上述的旋转只是二维坐标围绕着坐标原点进行旋转,那关于任意点旋转应该如何表示?其实关于任意点的旋转操作可以拆分为以下步骤:①将旋转点移动到坐标原点;②按绕原点的旋转规律进行旋转;③再将旋转点移回原处。


图片坐标python 图片坐标转换_图像处理_44

图4:任意点的二维旋转可拆分为平移+旋转

2、三维坐标变换

2.1、三维平移(Translation)

图片坐标python 图片坐标转换_图片坐标python图片坐标python 图片坐标转换_图像处理_46三个方向分别平移图片坐标python 图片坐标转换_齐次坐标_47个单位:


图片坐标python 图片坐标转换_齐次坐标_48

图5:点P的三维平移操作

图片坐标python 图片坐标转换_图片坐标python的平移向量为:
图片坐标python 图片坐标转换_齐次坐标_50
        为了拆分平移操作为向量和矩阵的乘法,我们仍然引入了齐次坐标。那么图片坐标python 图片坐标转换_二维_08可表示为:

图片坐标python 图片坐标转换_二维_52

图片坐标python 图片坐标转换_图像处理_53为平移矩阵。

2.2、三维缩放(Scale)

图片坐标python 图片坐标转换_图片坐标python图片坐标python 图片坐标转换_图像处理_46三个方向分别缩放图片坐标python 图片坐标转换_图像处理_56倍时,图片坐标python 图片坐标转换_二维_08坐标的向量形式为:

图片坐标python 图片坐标转换_二维_58

        将(12)进行拆分:

图片坐标python 图片坐标转换_图像处理_59

图片坐标python 图片坐标转换_图片坐标python_27就是缩放矩阵,任意三维坐标左乘图片坐标python 图片坐标转换_图片坐标python_27就可以得到缩放之后的新坐标图片坐标python 图片坐标转换_二维_62

2.3、三维旋转(Rotation)

图片坐标python 图片坐标转换_坐标变换_02指向右方,图片坐标python 图片坐标转换_图像处理_03指向上方,图片坐标python 图片坐标转换_齐次坐标_65指向前方,如图(6)所示:


图片坐标python 图片坐标转换_坐标变换_66

图6:右手坐标系

        三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,在本节我们考虑绕X、Y、Z轴的旋转。

2.3.1、绕X轴旋转

图片坐标python 图片坐标转换_坐标变换_67轴旋转,则把图(6)中的整个坐标系向右旋转,让图片坐标python 图片坐标转换_坐标变换_67轴指向前方。绕图片坐标python 图片坐标转换_坐标变换_67轴旋转,则不用考虑图片坐标python 图片坐标转换_坐标变换_67轴的坐标变化,三维坐标变为了二维坐标,图片坐标python 图片坐标转换_齐次坐标_71就构成了一个二维平面(图片坐标python 图片坐标转换_图像处理_72为坐标原点):


图片坐标python 图片坐标转换_二维_73

图7:绕X轴旋转的右手坐标系

图片坐标python 图片坐标转换_图像处理_74轴就是原来的图片坐标python 图片坐标转换_坐标变换_67轴,图片坐标python 图片坐标转换_齐次坐标_76轴也就是原来的图片坐标python 图片坐标转换_图像处理_74轴,因此根据二维坐标的旋转可得:
图片坐标python 图片坐标转换_坐标变换_78
        (15)的矩阵形式:

图片坐标python 图片坐标转换_齐次坐标_79

        注意:为了与平移的矩阵形式相同,旋转矩阵也采用了齐次坐标。

2.3.2、绕Y轴旋转

图片坐标python 图片坐标转换_图像处理_74轴旋转,则把图(6)中的整个坐标系向左旋转,让图片坐标python 图片坐标转换_图像处理_74轴指向前方。绕图片坐标python 图片坐标转换_图像处理_74轴旋转,则不用考虑图片坐标python 图片坐标转换_图像处理_74轴的坐标变化,三维坐标变为了二维坐标,图片坐标python 图片坐标转换_坐标变换_84就构成了一个二维平面(图片坐标python 图片坐标转换_图像处理_72为坐标原点):


图片坐标python 图片坐标转换_二维_86

图8:绕Y轴旋转的右手坐标系

图片坐标python 图片坐标转换_齐次坐标_76轴就是原来的图片坐标python 图片坐标转换_坐标变换_67轴,图片坐标python 图片坐标转换_坐标变换_67轴也就是原来的图片坐标python 图片坐标转换_图像处理_74轴,因此根据二维坐标的旋转可得:

图片坐标python 图片坐标转换_图像处理_91

        用矩阵形式来表示式子(16):

图片坐标python 图片坐标转换_图像处理_92

2.3.3、绕Z轴旋转

图片坐标python 图片坐标转换_齐次坐标_76轴旋转,则让图片坐标python 图片坐标转换_齐次坐标_76轴指向前方。绕图片坐标python 图片坐标转换_齐次坐标_76轴旋转,则不用考虑图片坐标python 图片坐标转换_齐次坐标_76轴的坐标变化,三维坐标变为了二维坐标,图片坐标python 图片坐标转换_图片坐标python_97就构成了一个二维平面(图片坐标python 图片坐标转换_图像处理_72为坐标原点):


图片坐标python 图片坐标转换_齐次坐标_99

图9:绕Z轴旋转的右手坐标系

图片坐标python 图片坐标转换_齐次坐标_76轴旋转,其实就是二维坐标绕原点旋转,因此可推出:

图片坐标python 图片坐标转换_二维_101

        (19)用矩阵表示:

图片坐标python 图片坐标转换_图片坐标python_102

3、注意

3.1、为什么要用齐次坐标?

        在图像处理中,我们往往不是单一地对某一坐标进行变换操作,而是会对大量的坐标进行一系列的变换操作。如果直接使用表达式的形式来进行变换操作也是可行的,但是这其中涉及大量的计算,而叠加各种变换系数后的表达式将变得十分臃肿且会降低程序的计算效率。

        解决办法就是将各种变换操作用一个单独的矩阵来进行表示,列如:
图片坐标python 图片坐标转换_坐标变换_103
        (21)表示对三维坐标先进行平移,然后缩放,最后再旋转等一系列操作,其中图片坐标python 图片坐标转换_图像处理_104是旋转矩阵,图片坐标python 图片坐标转换_图片坐标python_27是缩放矩阵,图片坐标python 图片坐标转换_图像处理_53是平移矩阵。

        采用矩阵形式来表达变换操作有如下好处:①可以更简便地表示变换操作;②矩阵形式非常利于计算机处理,可以加快计算效率。

        正是基于以上的原因,所以我们需要将变换操作都统一用矩阵的形式来表示。

        读者可以发现:无论是二维坐标的平移还是三维坐标的平移都无法直接用矩阵形式来表示,这也是为什么我们要引入齐次坐标的原因。二维坐标通过引入齐次坐标变成三维坐标,从而可以很轻松地使用矩阵形式来表示平移操作;三维坐标则通过引入齐次坐标变为四维坐标,用四维坐标方式来描述三维的平移操作。

3.2、在三维坐标中,如何用矩阵形式来表示绕X、Y、Z的负方向进行旋转?

        在2.3节中,从图片坐标python 图片坐标转换_图片坐标python_107可以看出,我们只考虑了向正方向进行旋转,想要考虑负方向的旋转则只需要图片坐标python 图片坐标转换_图像处理_108即可,可以表示为图片坐标python 图片坐标转换_图像处理_109,然后再化解表达式,求出沿负方向的变换矩阵。

4、总结

        我们在讨论二维坐标变换的基本原理之后,将二维坐标变换的理论迁移到三维坐标变换,并深入讨论关于三维坐标变换的基础原理。我们细致地解释了用变换矩阵的形式来代替变换表达式以及引入齐次坐标的原因。在最后,我们探讨了如何用矩阵形式来表示沿坐标轴的负方向进行旋转变换。