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