详解 图像旋转变换 原理

时间:2024-05-21 16:33:02

1、简介

旋转变换是计算机图像学中应用非常广泛的一种变换,为了后面解释的需要,我们也添加了平移变换、缩放变化等内容。文章重点介绍关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。

2、平移变换

将三维空间中的一个点 [x,y,z,1][x, y, z, 1] 移动到另外一个点 [x,y,z,1][x', y', z', 1],三个坐标轴的移动分量分别为dx=Tx,dy=Ty,dz=Tz,dx=Tx, dy=Ty, dz=Tz,

{x=x+Txy=y+Tyz=z+Tz\begin{cases} x' = x + Tx \\ y' = y + Ty \\ z' = z + Tz \end{cases}

平移变换的矩阵如下。

[xyz1]=[100Tx010Ty001Tz0001][xyz1]\begin{bmatrix} x'\\ y' \\ z' \\1 \end {bmatrix} = \begin {bmatrix} 1 & 0 & 0 & Tx \\ 0 & 1 &0 & Ty \\ 0 & 0 & 1 & Tz \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix}

3、缩放变换

将模型放大或者缩小,本质也是对模型上每个顶点进行放大和缩小(顶点坐标值变大或变小),假设变换前的点是 [x,y,z,1][x, y, z, 1],变换后的点是 [x,y,z,1][x', y', z', 1],那么

{x=xSxy=ySyz=zSz\begin{cases} x' = x * S_x \\ y' = y * S_y \\ z' = z * S_z \end{cases}

缩放变换的矩阵如下。

[xyz1]=[Sx0000Sy0000Sz00001][xyz1]\begin{bmatrix} x'\\ y' \\ z' \\1 \end {bmatrix} = \begin {bmatrix} S_x & 0 & 0 & 0 \\ 0 & S_y &0 & 0 \\ 0 & 0 & S_z & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix}

3、逆矩阵

平移变换矩阵的逆矩阵与原来的平移量相同,但是方向相反。

T1T=[100Tx010Ty001Tz0001][100Tx010Ty001Tz0001]=I T^{-1} \cdot T = \begin {bmatrix} 1 & 0 & 0 & -T_x \\ 0 & 1 & 0 & -T_y \\ 0 & 0& 1 & -T_z \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & T_x \\ 0 & 1 & 0 & T_y \\ 0 & 0& 1 & T_z \\ 0 & 0 & 0 & 1 \end {bmatrix} = I \quad

旋转变换矩阵的逆矩阵与原来的旋转轴相同但是角度相反。

R1R=[10000cosθsinθ00sinθcosθ00001][10000cosθsinθ00sinθcosθ00001]=I R^{-1} \cdot R = \begin {bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & sin\theta & 0 \\ 0 & -sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin {bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix}= I

R1R=[cosθ0sinθ00100sinθ0cosθ00001][cosθ0sinθ00100sinθ0cosθ00001]=I R^{-1} \cdot R = \begin {bmatrix} cos\theta & 0 & -sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin {bmatrix} cos\theta & 0 & sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} = I

R1R=[cosθsinθ00sinθcosθ0000100001][cosθsinθ00sinθcosθ0000100001]=I R^{-1} \cdot R = \begin {bmatrix} cos\theta & sin\theta & 0 & 0 \\ -sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin {bmatrix} cos\theta & -sin\theta & 0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} = I

4、旋转变换

4.1 绕原点二维旋转

首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的场景是绕着坐标原点进行的旋转,如下图所示:

详解 图像旋转变换 原理

如图所示点 (x,y)(x, y) 绕原点 逆时针旋转 θ\theta ,得到点 (x,y)(x', y')

注:此处的 θ\theta 为负值,因此旋转过后的 (x,y)(x',y') 坐标采用 (α+θ)(\alpha + \theta) 而不是 (αθ)(\alpha - \theta)

矩阵解释:

[xy]=[cosθsinθcosθsinθ][xy]\begin{bmatrix} x'\\ y' \end {bmatrix} = \begin {bmatrix} cos\theta & -sin\theta \\ cos\theta & sin\theta \end {bmatrix} \cdot \begin{bmatrix} x\\ y \end {bmatrix}

利用矩阵乘法展开为

{x=xcosθysinθy=xcosθ+ysinθ\begin{cases}x' = x\cdot cos\theta - y\cdot sin\theta \\ y' =x\cdot cos\theta+y\cdot sin\theta\end{cases}

极坐标解释:

此处不用直角坐标系解释,极坐标解释更便于理解
(x,y)(x,y) 坐标:{x=rcosαy=rsinα\begin{cases}x = r\cdot cos\alpha \\ y =r \cdot sin\alpha \end{cases}

(x,y)(x',y') 坐标:{x=rcos(α+θ)     =rcosαcosθrsinαsinθ     =xcosθysinθy=rsin(α+θ)     =rsinαcosθ+rcosαsinθ     =xcosθ+ysinθ\begin{cases}x' = r\cdot cos(\alpha + \theta) \\ \space\space\space\space\space = r\cdot cos\alpha\cdot cos \theta - r \cdot sin \alpha\cdot sin \theta \\ \space\space\space\space\space = x\cdot cos \theta -y\cdot sin \theta \\ \\ y' =r \cdot sin(\alpha + \theta) \\ \space\space\space\space\space = r\cdot sin\alpha\cdot cos \theta + r \cdot cos \alpha\cdot sin \theta \\ \space\space\space\space\space = x\cdot cos \theta +y\cdot sin \theta \end{cases}

4.2 绕任意点的二维旋转

绕原点的旋转是二维旋转最基本的情况,当我们需要进行绕任意点旋转时,我们可以把这种情况转换到绕原点的旋转,思路如下:

  1. 首先将旋转点移动到原点处
  2. 执行如2所描述的绕原点的旋转
  3. 再将旋转点移回到原来的位置

详解 图像旋转变换 原理

也就是说在处理绕任意点旋转的情况下需要执行两次平移的操作。假设平移的矩阵是 T(x,y)T(x,y),也就是说我们需要得到的坐标 v=T(x,y)RT(x,y)v'=T(x,y)*R*T(-x,-y)(我们使用的是列坐标描述点的坐标,因此是左乘,首先执行 T(x,y)T(-x,-y)

在计算机图形学中,为了统一将平移、旋转、缩放等用矩阵表示,需要引入齐次坐标。(假设使用2x2的矩阵,是没有办法描述平移操作的,只有引入3x3矩阵形式,才能统一描述二维中的平移、旋转、缩放操作。同理必须使用4x4的矩阵才能统一描述三维的变换)。

对于二维平移,如下图所示,PP 点经过x和y方向的平移到 PP' 点,可以得到:

详解 图像旋转变换 原理

{x=x+txy=y+ty\begin{cases} x′=x+t_x \\ y′=y+t_y \end{cases}

由于引入了齐次坐标,在描述二维坐标的时候,使用 (xyw)(x,y,w) 的方式(一般 w=1w=1 ),于是可以写成下面矩阵的形式

[xy1]=[10tx01ty001][xy1]\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}

按矩阵乘法展开,正好得到上面的表达式。其中平移矩阵是

[10tx01ty001]\quad \begin {bmatrix} 1 & 0 &tx \\ 0 & 1 & ty \\ 0 & 0 & 1 \end {bmatrix}

此时将绕原点二维旋转中描述的旋转矩阵也扩展到 3x3 的方式,变为:

[xy1]=[cosθsinθ0sinθcosθ0001][xy1]\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}

从平移和旋转的矩阵可以看出,3x3 矩阵的前 2x2 部分是和旋转相关的,第三列与平移相关。有了上面的基础之后,我们很容易得出二维中绕任意点旋转的旋转矩阵了,只需要把三个矩阵乘起来即可:

M=[10tx01ty001][cosθsinθ0sinθcosθ0001][10tx01ty001] M = \begin {bmatrix} 1 & -0 & tx \\ 0 & 1 & ty \\ 0 & 0 & 1 \end {bmatrix} \cdot \begin {bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end {bmatrix} \cdot \begin {bmatrix} 1 & 0 & -tx \\ 0 & 1 & -ty \\ 0 & 0 & 1 \end {bmatrix}

4.3 三维基本旋转

我们可以把一个旋转转换为绕基本坐标轴的旋转,因此有必要讨论一下绕三个坐标值 x,y,zx,y,z 的旋转。

本文在讨论过程中使用的是类似于OpenGL中定义的右手坐标系,同时旋转角度的正负也遵循右手坐标系的约定。如下图所示

详解 图像旋转变换 原理

4.3.1 绕X轴的旋转

详解 图像旋转变换 原理

在三维场景中,当一个点 P(x,y,z)P(x,y,z)XX 轴旋转 θ\theta 角得到点 P(x,y,z)P'(x',y',z')。由于是绕 XX 轴进行的旋转,因此 XX 坐标保持不变,YYZZ 组成的 YOZYOZOO是坐标原点)平面上进行的是一个二维的旋转,可以参考上图(YY轴类似于二维旋转中的 XX 轴,ZZ 轴类似于二维旋转中的 YY轴),于是有:

{x=xy=ycosθzsinθz=ysinθ+zcosθ\begin{cases} x′=x \\ y′=ycos\theta−zsin\theta \\ z′=ysin\theta+zcos\theta \end{cases}

写成(4x4)矩阵的形式

[xyz1]=[10000cosθsinθ00sinθcosθ00001][xyz1]\begin{bmatrix} x'\\ y' \\ z' \\1 \end {bmatrix} = \begin {bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix}

4.3.2 绕Y轴旋转

详解 图像旋转变换 原理

YY 轴的旋转和绕 XX 轴的旋转类似,YY 坐标保持不变,除Y轴之外,ZOXZOX组成的平面进行一次二维的旋转(ZZ轴类似于二维旋转的XX轴,XX 轴类似于二维旋转中的 YY 轴,注意这里是 ZOXZOX ,而不是 XOZXOZ,观察上图中右手系的图片可以很容易了解到这一点),同样有:

{x=zsinθ+xcosθy=yz=zcosθxsinθ\begin{cases} x′=zsin\theta+xcos\theta \\ y′=y \\ z′=zcos\theta-xsin\theta \end{cases}

写成(4x4)矩阵的形式

[xyz1]=[cosθ0sinθ00100sinθ0cosθ00001][xyz1]\begin{bmatrix} x'\\ y' \\ z' \\1 \end {bmatrix} = \begin {bmatrix} cos\theta & 0 & sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix}

4.3.3 绕Z轴旋转

详解 图像旋转变换 原理

与上面类似,绕 ZZ 轴旋转,ZZ 坐标保持不变,XOYXOY组成的平面内正好进行一次二维旋转(和上面讨论二维旋转的情况完全一样)

[xyz1]=[cosθsinθ00sinθcosθ0000100001][xyz1]\begin{bmatrix} x'\\ y' \\ z' \\1 \end {bmatrix} = \begin {bmatrix} cos\theta & -sin\theta & 0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix}

4.4 小结

上面描述了三维变换中绕单一轴旋转的矩阵表达形式,绕三个轴旋转的矩阵很类似,其中绕y轴旋转的矩阵与绕 XXZZ 轴旋转的矩阵略有点不同(主要是三个轴向顺序和书写矩阵的方式不一致导致的,绕三个不同坐标旋转轴以及其他二个坐标轴组成平面的顺序是: XYZXYZ (绕 XX 轴) YZXYZX(绕YY 轴) ZXYZXY(绕 ZZ 轴),其中绕 YY 轴旋转,其他两个轴是 ZXZX,这和我们书写矩阵按

[xyz1]\begin{bmatrix} x\\ y\\z\\1 \end {bmatrix}

的方式不一致,而导致看起来绕 YY 轴旋转的矩阵似乎是和其他两个矩阵不一致。如果我们颠倒写法,将公式写成

[zyx1]=[cosθ0sinθ00100sinθ0cosθ00001][zyx1]\begin{bmatrix} z' \\ y' \\ x' \\1 \end {bmatrix} = \begin {bmatrix} cos\theta & 0 & -sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ sin\theta & 0& cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} z \\ y \\ x \\ 1 \end {bmatrix}

的方式,那么这三个旋转矩阵看起来在形式上就统一了,都是

[cosθsinθcosθsinθ]\quad \begin {bmatrix} cos\theta & -sin\theta \\ cos\theta & sin\theta \end {bmatrix}

这种表现形式了(右上角都是 sinθ−sin\theta

5、绕任意轴的三维旋转

绕任意轴旋转的情况比较复杂,主要分为两种情况,一种是平行于坐标轴的,一种是不平行于坐标轴的。

5.1 平行坐标轴

对于平行于坐标轴的,我们首先将旋转轴平移至与坐标轴重合,然后进行旋转,最后再平移回去。

  1. 将旋转轴平移至与坐标轴重合,对应平移操作 TT
  2. 旋转,对应操作 RR
  3. 步骤1的逆过程,对应操作 T1T^{-1}

整个过程就是
P=T1RTPP' = T^{-1} \cdot R \cdot T \cdot P

5.2 不平行坐标轴

对于不平行于坐标轴的,可按如下方法处理。(该方法实际上涵盖了上面的情况)

绕任意轴的三维旋转可以使用类似于绕任意点的二维旋转一样,将旋转分解为一些列基本的旋转。绕任意轴旋转如下图所示:

  1. 将旋转轴平移至原点
  2. 将旋转轴旋转至 YOZYOZ 平面
  3. 将旋转轴旋转至于 ZZ 轴重合
  4. ZZ 轴旋转 θ\theta
  5. 执行步骤3的逆过程
  6. 执行步骤2的逆过程
  7. 执行步骤1的逆过程

图形详解过程:

步骤1:

将原旋转轴 uu 平移 vv 至过原点 OO ,对应矩阵操作

P1=[100Tx010Ty001Tz0001][xyz1]=T1PP_1 = \begin {bmatrix} 1 & 0 & 0 & Tx \\ 0 & 1 &0 & Ty \\ 0 & 0 & 1 & Tz \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ 1 \end {bmatrix} =T_1 \cdot P

详解 图像旋转变换 原理

步骤2:

旋转操作,将 uuzz 轴旋转 α\alpha 角 至 XOZXOZ 平面,对应的图如下

P2=[cosαsinα00sinαcosα0000100001][x1y1z11]=RzP1 P_2 = \begin {bmatrix} cos\alpha & -sin\alpha & 0 & 0 \\ sin\alpha & cos\alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ 1 \end {bmatrix} =R_z \cdot P_1

详解 图像旋转变换 原理

步骤3:

步骤3也是一个旋转操作,将 uuyy 旋转 β\beta 至与 xx 轴重合,对应的图如下

P3=[cosβ0sinβ00100sinβ0cosβ00001][x2y2z21]=RyP2P_3 = \begin {bmatrix} cos\beta & 0 & sin\beta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\beta & 0 & cos\beta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x_2 \\ y_2 \\ z_2 \\ 1 \end {bmatrix} =R_y \cdot P_2

详解 图像旋转变换 原理

步骤4:

此时原旋转轴经过一系列的操作,已经与 xx 轴重合了 ,即 uu'' ,此时原来的 P,QP , Q 点已经映射到 P,QP' ,Q' ,只需将 PP'xx 轴旋转 θ\theta 角便可得到 QQ' 点,此时的操作为:

P4=[10000cosθsinθ00sinθcosθ00001][x3y3z31]=RxP3P_4 = \begin {bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \end {bmatrix} \cdot \begin{bmatrix} x_3 \\ y_3 \\ z_3 \\ 1 \end {bmatrix} =R_x \cdot P_3

详解 图像旋转变换 原理

步骤5:

此时再将 步骤3,2,1逆操作即可得到原始点 PP 点绕旋转轴 uu 旋转 θ\theta 角后的点 QQ

对应的操作即为 Q=T1Rz1Ry1P4 Q = T^{-1} \cdot R_z^{-1} \cdot R_y^{-1} \cdot P_4

综述:

对于不平行于坐标轴的旋转其实已经包含了平行于坐标轴的旋转,因此对于绕任意轴的三维旋转可以总结为:

Q=MP Q = M \cdot P
其中 M=T1Rz1Ry1RxRyRxT M = T^{-1} \cdot R_z^{-1} \cdot R_y^{-1} \cdot R_x \cdot R_y \cdot R_x \cdot T

5.3 α,β,θ 角度补充

为了全文的排版,以及读者体验,上述解释全部采用的 α,β,θ\alpha ,\beta ,\theta ,具体从何得来并没有做解释说明,在此将对 α,β,θ\alpha ,\beta ,\theta 的缘由做个详细解释。

  1. 在此,假设旋转轴 uu[(a1,b1,c1),(a2b2,c2)][(a_1,b_1,c_1),(a_2,b_2,c_2)] 表示
    详解 图像旋转变换 原理
  1. 旋转轴 uu 经过平移 T1T_1 变换后过原点的旋转轴 uu'uu' 的坐标为 (a,b,c)(a,b,c)
    详解 图像旋转变换 原理
  1. 旋转轴 uu' 上的点 (a,b,c)(a,b,c)
    XOYXOY 平面上的投影为 OA(a,b,0)OA(a,b,0)
    XOZXOZ 平面上的投影为 OB(a,0,c)OB(a,0,c)
    那么
    sinα=ba2+b2  ,  cosα=aa2+b2sin\alpha = { b \over \sqrt{a^2 + b^2}} \space\space , \space\space cos\alpha = {a \over \sqrt{a^2 + b^2}}
    sinβ=ca2+c2  ,  cosβ=aa2+c2sin\beta = { c \over \sqrt{a^2 + c^2}}\space\space , \space\space cos\beta = {a \over \sqrt{a^2 + c^2}}
    详解 图像旋转变换 原理

参考链接:

https://www.cnblogs.com/zhoug2020/p/7842808.html
https://www.cnblogs.com/graphics/archive/2012/08/10/2627458.html