谁可以通俗的给我讲讲"仿射变换"这个概念么?
以下内容仅涉及图形变换,未考虑更为抽象的概念。
为了方便起见,以下叙述均采用平面直角坐标系。
一个矢量(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,前面的就是线性变换加上一个平移变换的结果。
这就是仿射变换。简单的说就是一个线性变换加上平移。
写公式和矩阵真坑爹啊。。。