在计算机图像学中常常涉及到对图像的进行各种变换,包括平移、旋转、缩放、剪切等操作,它们被称为坐标变换或仿射变换。本篇文章将由浅到深,详细地讨论关于图像坐标变换的原理。
1、二维坐标变换
在本篇文章中,我们重点来讨论二维图像和三维图像的坐标变换。为了更好去理解三维坐标变换,我们先讨论二维坐标变换。
1.1、二维平移(Translation)
在图(1)中,把P点分别向x和y方向平移tx和ty个单位:

图1:点P经过平移后得到点P'
点P经过上述的平移之后,得到P′:
P′=p+t=(x+tx,y+ty).(1)
如果我们将点P′的坐标用矩阵的方式来表示,则可以得到:
P′=[x+txy+ty](2)
我们是否可以将式子(2)拆开成为原坐标向量和平移变换矩阵的乘法?然而,根据线性代数的基础知识可知,无法将(2)进行拆分。(读者可以动手试一试,看能不能拆开。至于为什么要拆开,我们将在后面讨论)
为了将式子(2)拆开,我们就必须引入齐次坐标。齐次坐标无非就是将二维的矩阵变为三维,并在第三维用数字1来填充:
P′=⎣⎡x+txy+ty1⎦⎤(3)
此时我们就可以拆开式子(3)用矩阵和向量的乘法来表示:
P′=⎣⎡x+txy+ty1⎦⎤=⎣⎡100010txty1⎦⎤⋅⎣⎡xy1⎦⎤(4)
为了更加简便,我们将(4)继续化简:
=[I0t1]⋅⎣⎡xy1⎦⎤(5)
其中I为单位矩阵,t为平移的向量[tx,ty]T。任意一点坐标[x,y,1]T左乘平移矩阵就可以得到平移后的位置P′。
1.2、二维缩放(Scale)
在图(2)中,我们沿P点的x,y轴分别缩放Sx、Sy倍:

图2:对P点进行缩放
在图(2)中,我们为了与平移的矩阵形式统一也采用了齐次坐标,则P′坐标的向量形式:
p′→⎣⎡SxxSyy1⎦⎤(6)
将(6)拆分为坐标向量和缩放矩阵的乘法:
=⎣⎡Sx000Sy0001⎦⎤⋅⎣⎡xy1⎦⎤=[S′001]⋅⎣⎡xy1⎦⎤=S⋅⎣⎡xy1⎦⎤.(7)
其中S为缩放矩阵,P点的位置向量左乘缩放矩阵S便可得到缩放后的点P′。
1.3、三维旋转(Rotation)
如图(3)所示,我们将OP向量旋转β角度到OP′:

图3:P点旋转至点P’
根据三角函数关系以及极坐标系的机制,我们可以将P和P′表示为:
P(x,y)={x=r⋅cosαy=r⋅sinαP′(x′,y′)={x′=r⋅cos(α+β)y′=r⋅sin(α+β)(8)
在(8)中,r就是向量∣OP∣的长度。
我们将式子(8)的P′(x′,y′)展开:
{x′=r⋅cosαcosβ−r⋅sinαsinβ=xcosβ−ysinβy′=r⋅sinαcosβ+r⋅cosαsinβ=xsinβ+ycosβ(9)
将上述表达式用矩阵来表示:
⎣⎡x′y′1⎦⎤=⎣⎡cosβsin0−sinβcosβ0001⎦⎤⋅⎣⎡xy1⎦⎤(10)
这就是二维旋转的基本形式,中间的矩阵即二维旋转的旋转矩阵,坐标向量左乘该矩阵后,即得到这个向量旋转β角度后的新坐标。
读者可能会注意到,上述的旋转只是二维坐标围绕着坐标原点进行旋转,那关于任意点旋转应该如何表示?其实关于任意点的旋转操作可以拆分为以下步骤:①将旋转点移动到坐标原点;②按绕原点的旋转规律进行旋转;③再将旋转点移回原处。

图4:任意点的二维旋转可拆分为平移+旋转
2、三维坐标变换
2.1、三维平移(Translation)
图(5)中,点P向x、y、z三个方向分别平移Tx、Ty、Tz个单位:

图5:点P的三维平移操作
点P的平移向量为:
T′=⎣⎡TxTyTz⎦⎤(11)
为了拆分平移操作为向量和矩阵的乘法,我们仍然引入了齐次坐标。那么P′可表示为:
P′→[I0T′1]4×4⋅⎣⎡xyz1⎦⎤→T⋅⎣⎡xyz1⎦⎤(12)
(12)便是三维坐标的平移操作,其中T为平移矩阵。
2.2、三维缩放(Scale)
三维坐标的缩放与二维类似,当点P向x、y、z三个方向分别缩放Sx、Sy、Sz倍时,P′坐标的向量形式为:
P′→⎣⎡SxxSyySzz1⎦⎤(13)
将(12)进行拆分:
=⎣⎡Sx0000Sy0000Sz00001⎦⎤⋅⎣⎡xyz1⎦⎤=[S′001]⋅⎣⎡xyz1⎦⎤=S⋅⎣⎡xyz1⎦⎤(14)
(14)中的S就是缩放矩阵,任意三维坐标左乘S就可以得到缩放之后的新坐标P’。
2.3、三维旋转(Rotation)
在三维旋转中,我们遵守右手准则,即x指向右方,y指向上方,z指向前方,如图(6)所示:

图6:右手坐标系
三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,在本节我们考虑绕X、Y、Z轴的旋转。
2.3.1、绕X轴旋转
绕X轴旋转,则把图(6)中的整个坐标系向右旋转,让X轴指向前方。绕X轴旋转,则不用考虑X轴的坐标变化,三维坐标变为了二维坐标,YOZ就构成了一个二维平面(O为坐标原点):

图7:绕X轴旋转的右手坐标系
根据图(7)可知,Y轴就是原来的X轴,Z轴也就是原来的Y轴,因此根据二维坐标的旋转可得:
P(x,y,z)=⎩⎨⎧x=xy=r⋅cosαz=r⋅sinαP′(x′,y′,z′)=⎩⎨⎧x′=xy′=r⋅cos(α+β)=rcosαcosβ−rsinαsinβz′=r⋅sin(α+β)=rsinαcosβ+rcosαsinβ(15)
(15)的矩阵形式:
⎣⎡x′y′z′1⎦⎤=⎣⎡10000cosβsinβ00−sinβcosβ00001⎦⎤⋅⎣⎡xyz1⎦⎤=R⋅⎣⎡xyz1⎦⎤(16)
注意:为了与平移的矩阵形式相同,旋转矩阵也采用了齐次坐标。
2.3.2、绕Y轴旋转
绕Y轴旋转,则把图(6)中的整个坐标系向左旋转,让Y轴指向前方。绕Y轴旋转,则不用考虑Y轴的坐标变化,三维坐标变为了二维坐标,ZOX就构成了一个二维平面(O为坐标原点):

图8:绕Y轴旋转的右手坐标系
根据图(8)可知,Z轴就是原来的X轴,X轴也就是原来的Y轴,因此根据二维坐标的旋转可得:
P(x,y,z)=⎩⎨⎧x=r⋅sinαy=yz=r⋅cosαP′(x′,y′,z′)=⎩⎨⎧x′=r⋅sin(α+β)=rsinαcosβ+rcosαsinβy′=yz′=r⋅cos(α+β)=rcosαcosβ−rsinαsinβ=⎩⎨⎧x′=xcosβ+zsinβy′=yz′=−xsinβ+zcosβ(17)
用矩阵形式来表示式子(16):
⎣⎡x′y′z′1⎦⎤=⎣⎡cosβ0−sinβ00100sinβ0cosβ00001⎦⎤⋅⎣⎡xyz1⎦⎤=R⋅⎣⎡xyz1⎦⎤(18)
2.3.3、绕Z轴旋转
绕Z轴旋转,则让Z轴指向前方。绕Z轴旋转,则不用考虑Z轴的坐标变化,三维坐标变为了二维坐标,XOY就构成了一个二维平面(O为坐标原点):

图9:绕Z轴旋转的右手坐标系
根据图(8)可知,绕Z轴旋转,其实就是二维坐标绕原点旋转,因此可推出:
P(x,y,z)=⎩⎨⎧x=r⋅cosαy=r⋅sinαz=zP′(x′,y′,z′)=⎩⎨⎧x′=r⋅cos(α+β)=rcosαcosβ−rsinαsinβy′=r⋅sin(α+β)=rsinαcosβ+rcosαsinβz′=z=⎩⎨⎧x′=xcosβ−ysinβy′==xsinβ+ycosβz′=z(19)
(19)用矩阵表示:
⎣⎡x′y′z′1⎦⎤=⎣⎡cosβsinβ00−sinβcosβ0000100001⎦⎤⋅⎣⎡xyz1⎦⎤=R⋅⎣⎡xyz1⎦⎤(20)
3、注意
3.1、为什么要用齐次坐标?
在图像处理中,我们往往不是单一地对某一坐标进行变换操作,而是会对大量的坐标进行一系列的变换操作。如果直接使用表达式的形式来进行变换操作也是可行的,但是这其中涉及大量的计算,而叠加各种变换系数后的表达式将变得十分臃肿且会降低程序的计算效率。
解决办法就是将各种变换操作用一个单独的矩阵来进行表示,列如:
R⋅S⋅T⋅⎣⎡xyz1⎦⎤(21)
(21)表示对三维坐标先进行平移,然后缩放,最后再旋转等一系列操作,其中R是旋转矩阵,S是缩放矩阵,T是平移矩阵。
采用矩阵形式来表达变换操作有如下好处:①可以更简便地表示变换操作;②矩阵形式非常利于计算机处理,可以加快计算效率。
正是基于以上的原因,所以我们需要将变换操作都统一用矩阵的形式来表示。
读者可以发现:无论是二维坐标的平移还是三维坐标的平移都无法直接用矩阵形式来表示,这也是为什么我们要引入齐次坐标的原因。二维坐标通过引入齐次坐标变成三维坐标,从而可以很轻松地使用矩阵形式来表示平移操作;三维坐标则通过引入齐次坐标变为四维坐标,用四维坐标方式来描述三维的平移操作。
3.2、在三维坐标中,如何用矩阵形式来表示绕X、Y、Z的负方向进行旋转?
在2.3节中,从(α+β)可以看出,我们只考虑了向正方向进行旋转,想要考虑负方向的旋转则只需要−β即可,可以表示为(α−β),然后再化解表达式,求出沿负方向的变换矩阵。
4、总结
我们在讨论二维坐标变换的基本原理之后,将二维坐标变换的理论迁移到三维坐标变换,并深入讨论关于三维坐标变换的基础原理。我们细致地解释了用变换矩阵的形式来代替变换表达式以及引入齐次坐标的原因。在最后,我们探讨了如何用矩阵形式来表示沿坐标轴的负方向进行旋转变换。
参考资料
1、2.2 坐标转换基础_哔哩哔哩_bilibili
2、3维旋转矩阵推导与助记 - 哔哩哔哩 (bilibili.com)
3、旋转变换(一)旋转矩阵 - 莫水千流 - 博客园 (cnblogs.com)
4、齐次坐标_子胤的博客-CSDN博客_齐次坐标