2D线性变换

我们可以使用一个 的矩阵乘以一个二维向量,得到一个新的二维向量

通过这种简单的公式可以实现许多实用的变换,包括缩放、切变、旋转、镜像等

缩放

缩放是最简单的变换操作,只需要沿着坐标轴乘以指定的倍数即可,构造一个 的方阵,即:

通过这个矩阵就能将指定坐标缩放至任意倍大小

例如,将图片 轴与 轴统一缩小一倍得到:

image-20240827142322852

轴 与 轴缩放比例不同时:

image-20240827143018066

切变

切变是一种特殊的平移,即其中一条边平行于坐标轴进行平移(将矩形变为的平行四边形)。随着远离原点,偏移量也会随之增大。水平或垂直切变矩阵:

切变也可以理解成只考虑一个坐标轴的旋转,通过旋转角度的 值来确定

例如,沿着水平方向向右切变 ,构造矩阵:

image-20240827155805160

沿着垂直方向向上切变 也是同理:

image-20240827160041627

旋转

假设,我们要将向量 旋转到向量 的位置,已知向量 轴的夹角为 ,向量长度为 ,得到各个点的位置信息:

image-20240827164209478

因为向量 是由向量 旋转角度 得到,所以向量大小不变。使用三角恒等式展开得到:

再通过 将公式简化一下:

构造二维线性变换矩阵:

例如,使用将一个图像旋转 ,需要构造矩阵:

image-20240827171035618

镜像

将图像以坐标轴为对称轴进行反射,只需要将除对称轴之外的其他坐标全都取相反数即可

image-20240827184405328

复合运算

通常我们会需要对一个图像进行多次变换,例如,先将图像缩放一次,再进行旋转一次

通过乘法结合律,可以将结果合并为:

由此可知,我们能将两个操作合并为一个最终的变换矩阵:

假设,我们需要将一个图像在垂直方向上缩小一倍,然后再旋转 ,计算得出最终的变换矩阵:

image-20240827213038031

特别注意:矩阵 的计算顺序是右侧优先,即先计算缩放 ,再计算旋转 。这个顺序非常重要,因为矩阵并不满足交换律,不同的运算顺序会产生不同的结果!!

image-20240827214152373

3D线性变换

3D变换只是在2D的基础上拓展一个 轴,例如,缩放矩阵多一个维度:

3D旋转会比2D复杂得多,但是我们依然可以在2D的基础上加上一个 实现简单的轴对称旋转:

对于 轴与 轴也是相同的做法:

3D切变与2D类似,沿着其中一条轴线平移即可:

任意向量旋转

与2D旋转相同,3D旋转矩阵也是一个正交矩阵,这意味矩阵的三行分别是三个相互正交的单位向量:

假设,三个单位矩阵分别为 ,由于相互正交:

若我们将旋转矩阵左乘单位矩阵 ,将得到:

观察结果矩阵,发现其与单位阵之间的关系:

相似的,我们还能得到 ,以及

因为旋转矩阵 是正交矩阵,所以它的逆矩阵就是 ,通过该逆矩阵也能实现反操作

对于一个任意向量 ,我们可以假设该向量位于 轴上(即 ),然后将其旋转到标准 坐标系,在对其进行指定的旋转操作,最后再使用逆矩阵将其旋转回 坐标系

平移

我们前面都是通过一个矩阵 左乘向量,实现该向量的线性变换,以二维平面为例:

通过这种方式,我们只能够实现缩放和旋转,却无法进行平移操作。其实,想要实现平移操作只需要给每个点增加一个偏移量即可:

单独定义一个这样的平移操作确实可以实现效果,但我们更希望能够与前面一样只使用一个矩阵 进行线性变换,既能实现缩放与旋转,也能兼顾平移操作

这里需要引入齐次坐标的概念,将点 拓展一个维度,写成新的三维向量 ,矩阵 也拓展一个维度:

使用修改过后的三维矩阵,就能够实现二维平面的线性变化(包括缩放、旋转和平移)

如果在进行线性变换时,不希望图像产生平移,只需要将向量的拓展维度设置为 即可:

这样左上角 的矩阵依然会对向量进行缩放或旋转,由于向量拓展维度 的存在将平移的操作忽略了

由于齐次坐标的拓展维度只会是 ,我们可以通过该值判断位置坐标或方向向量

在三维空间实现平移操作也是一样的使用齐次坐标,拓展一个维度即可:

参考资料

  • 齐次坐标
  • 《Fundamentals of Computer Graphics》 Chapter 6 Transaction Matrices