1. 简介

旋转矩阵是图像处理中常用的一种矩阵,它可以按照特定角度旋转图像。

在本教程中,我们将展示如何从一个旋转矩阵中推导出旋转角度。我们会从旋转矩阵出发,学习如何计算其对应的旋转角度。

2. 图像变换

变换是一种函数,它将一个集合映射到另一个集合。在计算机图形学中,变换用于调整图形在屏幕上的位置、大小和方向,是缩放、旋转、平移和剪切等操作的基础。

变换包括多种形式,例如:

  • 平移(Translation)
  • 缩放(Scaling)
  • 旋转(Rotation)
  • 剪切(Shearing)

2.1 平移

平移变换用于改变图像的位置。可以通过向原始坐标加上平移向量实现:

$$ X' = X + tx \ Y' = Y + ty $$

2.2 缩放

缩放变换用于调整对象的大小。可以通过将坐标乘以缩放因子来实现:

$$ X' = X \cdot S_x \ Y' = Y \cdot S_y $$

2.3 旋转

旋转操作是围绕坐标系原点旋转一定角度。二维旋转公式如下:

$$ X' = X \cos\theta - Y \sin\theta \ Y' = X \sin\theta + Y \cos\theta $$

2.4 剪切

剪切变换用于倾斜对象形状。常见类型包括 X 方向剪切和 Y 方向剪切:

  • X 剪切: $$ X' = X + Sh_x \cdot Y \ Y' = Y $$
  • Y 剪切: $$ X' = X \ Y' = Y + Sh_y \cdot X $$

也可以同时对 X 和 Y 进行剪切: $$ X' = X + Sh_x \cdot Y \ Y' = Y + Sh_y \cdot X $$

3. 图像变换矩阵

一个 $N \times N$ 的方阵可以作为 $N$ 维变换矩阵。由于图像坐标是二维的,因此我们可以用二维变换矩阵来表示图像像素的变换。

3.1 图像坐标的矩阵表示

图像坐标通常表示为 $2 \times 1$ 的矩阵:

$$ \text{Coordinate} = \begin{bmatrix} X \ Y \end{bmatrix} $$

变换后的坐标为:

$$ \text{New Coordinate} = \begin{bmatrix} X' \ Y' \end{bmatrix} $$

3.2 图像变换的矩阵表示

对像素进行多次变换时,前一个变换的结果作为下一个变换的输入:

$$ \text{Coordinate'} = \text{Transformation} \cdot \text{Coordinate} $$

多个变换矩阵可以合并为一个复合变换矩阵,从而实现复合变换。

3.3 齐次坐标表示

为了加速连续变换的计算,我们使用齐次坐标系统。在二维坐标基础上添加一个虚拟坐标:

$$ \text{Coordinate} = \begin{bmatrix} X \ Y \end{bmatrix} \equiv \text{Homogeneous Coordinate} = \begin{bmatrix} X \ Y \ 1 \end{bmatrix} $$

这样我们就可以用矩阵乘法统一描述所有变换。

3.4 图像变换的矩阵表示(复合)

如果先进行变换 $T_a$,再进行变换 $T_b$,则可以表示为:

$$ T_{ab} = T_a \cdot T_b \ \text{Coordinate'} = T_{ab} \cdot \text{Coordinate} $$

4. 仿射变换矩阵

仿射变换是一种线性映射,它保持点、线和平面的对应关系。在欧几里得几何中,它保留平行性,但不一定保留距离和角度。

仿射变换由一个线性变换和一个平移向量组成。以下是几种常见变换的矩阵形式。

4.1 平移变换

二维平移变换可表示为:

$$ \text{Coordinate'} = \text{Coordinate} + T \Rightarrow \begin{bmatrix} X' \ Y' \end{bmatrix} = \begin{bmatrix} X \ Y \end{bmatrix} + \begin{bmatrix} tx \ ty \end{bmatrix} $$

齐次坐标下的平移矩阵为:

$$ \begin{bmatrix} 1 & 0 & tx \ 0 & 1 & ty \ 0 & 0 & 1 \end{bmatrix} $$

4.2 缩放变换

缩放变换矩阵为:

$$ \begin{bmatrix} S_x & 0 \ 0 & S_y \end{bmatrix} $$

齐次坐标下为:

$$ \begin{bmatrix} S_x & 0 & 0 \ 0 & S_y & 0 \ 0 & 0 & 1 \end{bmatrix} $$

4.3 旋转变换

二维旋转矩阵为:

$$ \begin{bmatrix} \cos\theta & \sin\theta \ -\sin\theta & \cos\theta \end{bmatrix} $$

齐次坐标下为:

$$ \begin{bmatrix} \cos\theta & \sin\theta & 0 \ -\sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{bmatrix} $$

4.4 剪切变换

剪切矩阵如下:

  • X 剪切: $$ \begin{bmatrix} 1 & Sh_x \ 0 & 1 \end{bmatrix} $$
  • Y 剪切: $$ \begin{bmatrix} 1 & 0 \ Sh_y & 1 \end{bmatrix} $$

齐次坐标下的剪切矩阵为:

$$ \begin{bmatrix} 1 & Sh_x & 0 \ Sh_y & 1 & 0 \ 0 & 0 & 1 \end{bmatrix} $$

5. 齐次变换矩阵的组合

使用齐次坐标后,平移操作也变成了线性变换,便于与其他变换组合:

  • 齐次平移: $$ \begin{bmatrix} X' \ Y' \ 1

    \end{bmatrix}

    \begin{bmatrix} 1 & 0 & tx \ 0 & 1 & ty \ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X \ Y \ 1 \end{bmatrix} $$
  • 齐次缩放: $$ \begin{bmatrix} X' \ Y' \ 1

    \end{bmatrix}

    \begin{bmatrix} S_x & 0 & 0 \ 0 & S_y & 0 \ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X \ Y \ 1 \end{bmatrix} $$
  • 齐次旋转: $$ \begin{bmatrix} X' \ Y' \ 1

    \end{bmatrix}

    \begin{bmatrix} \cos\theta & \sin\theta & 0 \ -\sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X \ Y \ 1 \end{bmatrix} $$
  • 齐次剪切: $$ \begin{bmatrix} X' \ Y' \ 1

    \end{bmatrix}

    \begin{bmatrix} 1 & Sh_x & 0 \ Sh_y & 1 & 0 \ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X \ Y \ 1 \end{bmatrix} $$

复合变换矩阵可表示为: $$ T_{Affine} = T \cdot S \cdot R \cdot SH $$

6. 从旋转矩阵中提取欧拉角

我们通常将三维旋转分解为绕三个主轴的旋转。以下是欧拉角相关的旋转矩阵。

6.1 多轴旋转矩阵

绕 X 轴旋转 $p$ 弧度的矩阵为:

$$ \begin{bmatrix} 1 & 0 & 0 \ 0 & \cos p & -\sin p \ 0 & \sin p & \cos p \end{bmatrix} $$

绕 Y 轴旋转 $q$ 弧度的矩阵为:

$$ \begin{bmatrix} \cos q & 0 & \sin q \ 0 & 1 & 0 \ -\sin q & 0 & \cos q \end{bmatrix} $$

绕 Z 轴旋转 $r$ 弧度的矩阵为:

$$ \begin{bmatrix} \cos r & \sin r & 0 \ -\sin r & \cos r & 0 \ 0 & 0 & 1 \end{bmatrix} $$

6.2 广义旋转矩阵

广义欧拉旋转矩阵形式如下:

$$ R = \begin{bmatrix} R_{11} & R_{12} & R_{13} \ R_{21} & R_{22} & R_{23} \ R_{31} & R_{32} & R_{33} \end{bmatrix} $$

我们可以将其视为绕 X、Y、Z 轴连续旋转的乘积:

$$ R = R_z(r) \cdot R_y(q) \cdot R_x(p) $$

6.3 从旋转矩阵中提取欧拉角

通过将旋转矩阵 $R$ 与 $R_z(r) R_y(q) R_x(p)$ 的乘积逐项比较,我们可以解出欧拉角 $p, q, r$。

以下是伪代码:

algorithm EulerAnglesFromRotationMatrix(R):
    // INPUT
    //    R = 欧拉广义齐次旋转矩阵
    // OUTPUT
    //    p, q, r = 欧拉角(弧度)

    if R[3,1] != ±1:
        q1 <- asin(R[3,1])
        q2 <- π - q1
        p1 <- 2aT(R[3,2]/cos(q1), R[3,3]/cos(q1))
        p2 <- 2aT(R[3,2]/cos(q2), R[3,3]/cos(q2))
        r1 <- 2aT(R[2,1]/cos(q1), R[1,1]/cos(q1))
        r2 <- 2aT(R[2,1]/cos(q2), R[1,1]/cos(q2))
    else:
        r <- 任意值
        if R[3,1] = -1:
            q <- π / 2
            p <- r + 2aT(R[1,2], R[1,3])
        else:
            q <- -π / 2
            p <- -r + 2aT(-R[1,2], -R[1,3])

7. 图像旋转中的欧拉角

有了上述方法,我们就可以从图像的旋转矩阵中提取旋转角度。

7.1 图像旋转的特殊情况

图像通常在 XY 平面上旋转,即绕 Z 轴旋转。对应的旋转矩阵为:

$$ \begin{bmatrix} \cos\theta & \sin\theta & 0 \ -\sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{bmatrix} $$

我们只需提取 $\theta$ 即可。

7.2 从图像旋转矩阵提取欧拉角

我们只需将 $r$ 替换为 $\theta$,并设 $p=0, q=0$,即可使用前述伪代码求解 $\theta$。

7.3 直接法计算图像旋转角度

将旋转矩阵标准化为:

$$ \begin{bmatrix} A & B & 0 \ -B & A & 0 \ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \cos\theta & \sin\theta & 0 \ -\sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{bmatrix} $$

角度 $\theta$ 可通过以下方式计算:

$$ \theta = \arccos(A) \ \theta = \arcsin(B) \ \theta = \arctan\left(\frac{B}{A}\right) $$

7.4 多种解的情况

绕三个主轴的不同旋转顺序可能导致相同的最终方向。因此,旋转角度可能有多个解,需根据上下文选择合适的解。

8. 总结

在本文中,我们学习了如何从旋转矩阵中提取旋转角度。首先介绍了图像变换及其矩阵表示,然后通过分析旋转矩阵的结构,得出了提取旋转角度的方法。无论是直接法还是使用欧拉角,都能帮助我们从旋转矩阵中还原出图像的旋转信息。


原始标题:How to Calculate the Angle from Rotation Matrix