如何通俗地讲解「仿射变换」?

关注者
1,051
被浏览
1,326,474

23 个回答

简单来说,“仿射变换”就是:“线性变换”+“平移”。

先看什么是线性变换?

1 线性变换

线性变换从几何直观有三个要点:

  • 变换前是直线的,变换后依然是直线
  • 直线比例保持不变
  • 变换前是原点的,变换后依然是原点

比如说旋转:


比如说推移:



这两个叠加也是线性变换:


自己动手试一下(观察下是否符合之前的三个要求):


此处有互动内容,点击此处前往操作。

1.1 代数

简单讲一下旋转是怎么实现的,可以让我们进一步了解代数是怎么描述线性变换的。




你可以手动操作下,会发现旋转矩阵在不断变化(为了方便观察旋转,我标记出一个顶点):


此处有互动内容,点击此处前往操作。

总结下来,线性变换是通过矩阵乘法来实现的。

2 仿射变换

仿射变换从几何直观只有两个要点:

  • 变换前是直线的,变换后依然是直线
  • 直线比例保持不变

少了原点保持不变这一条。

比如平移:

因此,平移不再是线性变化了,而是仿射变化。

2.1 代数

我们来看下仿射变换是怎么用代数来表示的。

上一节我们说了,线性变换是通过矩阵乘法来实现的,仿射变换不能光通过矩阵乘法来实现,还得有加法。




因为我们表示仿射变换为:

\vec{y}=A\vec{x}+\vec{b}

2.2 通过线性变换来完成仿射变换

这是我觉得非常优美的一个地方:

什么意思?继续举例子:



这样我就可以在三维空间下通过\begin{bmatrix}A&\vec{b}\\0&1\end{bmatrix} 这个线性变换来操作z=1 平面上的二维正方形,完成仿射变换:

自己动手操作一下:


此处有互动内容,点击此处前往操作。

我们平移到需要的位置的时候:


如果还有没有清楚的地方,可以结合之前的描述,看一下维基百科“仿射变换”词条里的一个gif动图,非常生动的表明了这一过程:

更多内容查看马同学图解数学系列

以下内容仅涉及图形变换,未考虑更为抽象的概念。

为了方便起见,以下叙述均采用平面直角坐标系。

一个矢量(1,2)可以表示为从原点指向该点的箭头。

你可以对这个矢量进行缩放,比如放大两倍就变成了(2,4)

这个操作可以表示为2 x(1,2)。也就是说放大k倍就是k(x,y)

上面的例子写成矩阵的话就是,这里用到了矩阵乘法。

这个很简单。你也可以把矩阵中的两个值弄成不一样的。那么如果你对一张图片操作的话,横竖两个方向上的缩放倍数不同图像就变形了。方的变成长方的。

你也可以对矢量进行旋转。

比如想把向量(1,0)逆时针旋转45度。旋转以后的向量和这个向量会构成一个三角形。旋转以后的是斜边,长度和原来向量长度一样。用勾股定理计算一下。三角形的顶点会变成(√2/2, √2/2)。这个看起来比较麻烦。但是如果你明白矩阵乘法是怎么算的,那很容易理解为什么一个旋转矩阵会是这样的:

有些变换,比如反射。相当于你在第一种情况里面对角线上的两个值有一个是负的。那么对应的就会把这个轴翻转过去。别的都很好理解。

这些变换被称为线性变换。它提供了把一个图像扭成任意形状的方法。

但在二维坐标系内,用2x2的矩阵所不能表示的变换就是平移操作。你在上面所有的操作无非都是给向量的两个分量乘一个系数。没办法再加一个数。想要表达这种计算就得给你的矩阵变成这样:


这样的话你的(x,y)向量就没法乘进去了。你可以在后面添个1,编程(x,y,1)这样的。那么变换以后的结果就是

(xa1+yb1+c1,xa2+yb2+c2,1),去掉最后面的1,前面的就是线性变换加上一个平移变换的结果。

这就是仿射变换。简单的说就是一个线性变换加上平移。

写公式和矩阵真坑爹啊。。。