仿射变换的通俗解释

来源:互联网 发布:微软sql 编辑:程序博客网 时间:2024/06/10 07:43

最近看的论文里很多都用到了仿射变换,记得本科时,图形学老师曾经讲过这部分的重要性,无奈当时看到一大堆数学公式头晕脑胀,并没有真正领会仿射变换的真谛。最近看论文的过程中,愈发觉得仿射变换不管是在利用特征点的变化推断帧与帧之间目标框的变换上(例如RANSAC做图形拼接、图像匹配),还是样本的生成上(例如TLD中利用仿射将10个原始正样本变换成200个合成样本)。所以今天静下心来理解了一下仿射变换。下面是我在知乎上看到的一篇对仿射的解释,觉得通俗易懂,毕竟公式啥的都是模型,能把抽象的东西用很直白的语言表达出来让所有人都能够理解,才是大神的最高境界.....

原文链接 戳

作者:Cascade

以下内容仅涉及图形变换,未考虑更为抽象的概念。
为了方便起见,以下叙述均采用平面直角坐标系。

一个矢量(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,前面的就是线性变换加上一个平移变换的结果。

这就是仿射变换。


仿射变换可以理解为经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标域中的值
更简洁的说:仿射变换=线性变换+平移


0 0