只是我在学习坐标变换过程中记录的笔记,可能有理解错误或不到位之处。
在处理图像变换的过程中,需要使用齐次坐标。使用其次坐标可以方便地将空间的平移、缩放、旋转等用矩阵表示。
齐次坐标(Homogeneous Coordinates)是一个用于投影几何的坐标系统。这里不对齐次坐标进行详细的解释,只使用这样一个概念来解决图像变换中的问题。
如果一个点的坐标为(x,y,z),则将其扩展到四维后,其坐标为:(x,y,z,1);而如果(x,y,z)表示一个向量,则其其次坐标为(x,y,z,0)。
为了方便记忆,可以这样考虑:两个向量相减或相加的结果都是向量,因此向量的w值应当是0,所以点的w值为1。或者,因为两个点相减的结果是向量,所以点的w为1,而向量的w为0。
当希望对一个升到四维的坐标进行坐标变换时,需要一个4x4的变换矩阵。
平移矩阵的格式如下:
{
1,0,0,dx,
0,1,0,dy,
0,0,1,dz,
0,0,0,1
}
该矩阵与某坐标(x,y,z,1)的列向量进行矩阵乘法之后,得到的结果即为(x+dx,y+dy,z+dz)。
缩放矩阵的格式如下:
{
kx,0,0,0,
0,ky,0,0,
0,0,kz,0,
0,0,0,1
}
旋转矩阵可以对点的位置进行缩放(本质是位置向量),也可以对一个向量进行缩放。
不过上述的缩放矩阵只能沿三个坐标轴的方向进行缩放。
旋转矩阵较为复杂。推导的话应该是需要使用余弦定理。这里不给出具体的证明。
另外,由于旋转所围绕的旋转轴有很多选择,所以更增加了旋转矩阵的复杂度。这里只给出以x、y、z轴为旋转轴的情况下的旋转矩阵。
沿x轴旋转:
{
1,0,0,0,
0,cos(a),-sin(a),0,
0,sin(a),cos(a),0,
0,0,0,1
}
沿y轴旋转:
{
cos(a),0,sin(a),0,
0,1,0,0,
-sin(a),0,cos(a),0,
0,0,0,1
}
沿z轴旋转:
{
cos(a),-sin(a),0,0,
sin(a),cos(a),0,0,
0,0,1,0,
0,0,0,1
}
由于矩阵乘法满足结合律,所以在将平移、旋转、缩放的操作都作用在一个目标上时,可以通过将基础变换矩阵相乘得到复合变换矩阵之后再作用于原坐标。
将基础变换矩阵相乘得到复合变换矩阵的过程中需要遵循一定的顺序。
假定对一个图像进行一系列操作。一般来说,我们最希望其进行操作所对应的原点是其“锚点”。在这种情况下,一般来说,规定的变换顺序是缩放->旋转->平移。
可以这样理解:如果平移之后再进行缩放和旋转的操作,那么由于缩放和旋转变换的原点都是坐标原点,所以这时的操作得到的效果和预期“以锚点为原点”是不相符的。
缩放和旋转的顺序也可以用类似的例子得到。
所以可以得到最后的操作顺序:
M = M t r a n s l a t i o n M r o t a t i o n M s c a l e M={M}_{translation}{M}_{rotation}{M}_{scale} M=MtranslationMrotationMscale
除了不同基础变换矩阵之间的顺序,旋转矩阵之间的操作顺序也会影响得到的结果。因此,在不同的情况下,需要使用不同的顺序来将多个旋转矩阵相乘得到总的旋转矩阵。