仿射变换矩阵

GeometryTransformation 几何变换

对图像的几何变换本质上是一种线性变换,其数学本质为 
Inew=TIold

即通过变换矩阵 T 将原图上的点的位置 Iold 变换到新的位置,从而得到新的图像 Inew

2D平面变换示意图(”Computer Vision: Algorithms and Applications”, RichardSzeliski) 
- Translation
平移 
- Euclidean(rigid, rotation)
旋转 
- Scale
缩放;图中没有画出 
- Similarity
相似变换;结合旋转,平移和缩放 
- Affine
仿射变换;想象在similarity的基础上用两只手对图像进行按压拉伸 
- Projective
投影变换;想象投影仪做的事情,将一个面投影到另外一个面的情况


仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到的基本概念。这篇文章主要讲述什么是仿射变换和齐次坐标系,以及在图形系统中为什么要是用它们。不求全面,只为自己学习理解。

仿射变换其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换。统一平移变换和线性变换的一种变换我们起了个名字叫“仿射变换”。这个新的变换就不再单纯的是两个线性空间的映射了,而是变成了两个仿射空间的映射关系。为了更好地理解仿射变换,首先就要知道线性变换以及它的不足。在未说明的情况下,下面使用的是卡迪尔坐标系。

所谓线性变换是指两个线性空间的映射,一个变换\mathcal{L}:\mathcal{A}\to\mathcal{B}是线性变换,必须满足两个条件,也就是我们经常说的线性条件:

L(u+v)=L(u)+L(v)      additivity

L({\alpha}u)={alpha}L(u)      homogeneity

举个例子说明一下。建设L是一个二维绕原点旋转变换,uv是旋转角度。我们知道“一次性旋转u+v度”和“先旋转u度再旋转v读”达到的效果是一样的;同样地,“一次性旋转{\alpha}u度”和“旋转{\alpha}次u度”也是一张的。

线性变换可以用矩阵来表示。假设p=(x,y)^{T}是二维空间中的点,T是一线性变换,那么存在一个矩阵A,使得p'=(x',y')^{T}=T(p)=Ap。上面的旋转变换R,以及缩放S变换都有相应的变换矩阵

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{cc} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \\ \end{array} } \right] \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{cc} S_x & 0 \\ 0 & S_y \\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ \end{array} } \right]

但是在卡迪尔坐标系中,平移变换却不能用矩阵来表示。一个平移变换T具有如下的形式

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=T(p)= I \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]+\left[ {\begin{array}{c} t_x \\ t_y \\ \end{array} } \right]

我们可以很容易地验证,平移变换T是不能写成两个矩阵乘积形式的。使用齐次坐标系很好的解决了这个问题(可能还有其它的原因)。齐次坐标系统其实是用高维坐标来表示一个低维的点,就好比我们用(x,1)来表示一个长度值一样,其实用一个x就可以了,但是用高一维的表示,在有的时候会带来便利。一个N维的卡迪尔坐标系中的一个点p=(x_1,x_2,...,x_N),在齐次坐标系中有无数的N+1维点与之对应,这些点可以描述为p_H=(\omega x_1,\omega x_2,...,\omega x_N,\omega)\omega取不同的值,我们变得到齐次坐标系中不同的点。当把这些点映射到\omega=1平面(不改变x_i之间比例),我们又降维得到对应的卡迪尔坐标系中的点。在OpenGL中我们是用(x,y,z,1)(\omega=1)来表示一点三维的点,显然这个点与卡迪尔坐标系中的点(x,y,z)是一一对应的。在计算的过程中,会出现第四个分量不为\omega \neq 1的情况,这时我们也总是同除以\omega使齐次坐标正规化。现在回来让我们看看使用齐次坐标时,对应的线性变换是什么形式。假设p=(x,y,1)^{T}是二维点对应的齐次坐标,与上面使用卡迪尔坐标系类似,我们可以得到相应的线性变换如旋转变换R和缩放变换S的矩阵表示:

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{ccc} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1\\\end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{ccc} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

容易验证, (x', y')的值并没有变化。但是使用齐次坐标后,平移操作便也可以使用矩阵来表示了(如下),平移量出现在变换矩阵的最右侧。

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=T(p)= \left[ {\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

最后,我们给出仿射变换稍微正式点的定义。一个仿射变换T,可以表示成一个线性变换A后平移tT(p)=Ap+t,其中p是待变换的点齐次坐标表示。T可以表示成如下的形式:

\bf{T}=\left[ {\begin{array}{cccc} a_11&a_12&a_13&t_1\\ a_21&a_22&a_23&t_2\\ a_31&a32&a33&t_3\\ 0&0&0&1\\ \end{array}} \right]

其中,\bf{A}=\left[ {\begin{array}{ccc} a_11&a_12&a_13\\ a_21&a_22&a_23\\ a_31&a32&a33\\ \end{array}} \right]表示线性变换;\bf{t}=\left[ {\begin{array}{c} t_1\\ t_2\\ t_3\\ \end{array}} \right]表示平移变换;右下角的数字可以进行整体缩放,当为1时,表示不进行整体缩放。

仿射变换之所以重要,另一个重要的原因是仿射变换后不改变点的共线/共面性,而且还保持比例,这对图形系统尤其重要。例如,根据这个性质,如果我们要变换一个三角形,只需要对三个定点v1,v2,v3进行变换T就可以了,对于原先边v1v2上的点,变换后一定还在边后T(v1)T(v2)上。

总结一下,仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。

Advertisements

猜你喜欢

转载自blog.csdn.net/liangjiubujiu/article/details/80918428