1 仿射变换是什么
仿射变换 A f f i n e T r a n s f o r m a t i o n \mathsf{Affine\ Transformation} Affine Transformation 是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。由此可见,仿射变换其实是两种简单变换的叠加,即线性变换和平移变换。具体包括如下所有变换,以及这些变换按任意次序、任意次数的组合:
中英文对照:
- 平移 —— T r a n s l a t i o n \mathsf{Translation} Translation
- 旋转 —— R o t a t i o n \mathsf{Rotation} Rotation
- 缩放 —— S c a l i n g \mathsf{Scaling} Scaling
- 反射 —— R e f l e c t i o n \mathsf{Reflection} Reflection
- 剪切 —— S h e a r M a p p i n g \mathsf{Shear\ Mapping} Shear Mapping
仿射变换的性质:
- 凸性:凸集合在仿射变换后依然是凸集合;
- 共线性:同一直线上的若干个点,在仿射变换后仍然处于同一直线上;
- 平行性:两条平行的直线,在仿射变换后仍然平行;
- 共线比例不变性:同一直线上两条线段的比例,在仿射变换后比例不变。
2 仿射变换的数学表达式
一个集合 X X X 的仿射变换为:
f ( x ) = A x + b , x ∈ X f(x)=Ax+b,\ x\in X f(x)=Ax+b, x∈X
在二维平面中,仿射变换的一般表达式为:
[ x ′ y ′ 1 ] = [ R 00 R 01 T x R 10 R 11 T y 0 0 1 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \begin{bmatrix} R_{00} & R_{01} & T_x \\ R_{10} & R_{11} & T_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 = R00R100R01R110TxTy1 xy1
仿射变换可以视为线性变换 R R R 和平移变换 T T T 的叠加,其中:
R = [ R 00 R 01 R 10 R 11 ] , T = [ T x T y ] R=\begin{bmatrix} R_{00} & R_{01}\\ R_{10} & R_{11} \end{bmatrix},\ T= \begin{bmatrix} T_x \\ T_y \end{bmatrix} R=[R00R10R01R11], T=[TxTy]
为什么二维的图像需要三维的变换矩阵?
所有平移量为 0 0 0 的仿射变换都可以用如下变换矩阵表示:
[ x ′ y ′ ] = [ a b c d ] [ x y ] \begin{bmatrix} x' \\ y' \end{bmatrix}= \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} [x′y′]=[acbd][xy]
不同变换所对应的 a , b , c , d a,b,c,d a,b,c,d 约束不同,除平移变换外的所有仿射变换统称为线性变换。其特点是原点位置保持不变,并且多次线性变换的结果仍是线性变换。
为了涵盖平移,引入了齐次坐标,即在原有的二维坐标的基础上增广了一个维度,如下所示:
[ x ′ y ′ 1 ] = [ a b c d e f 0 0 1 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 = ad0be0cf1 xy1
只不过把 a a a 到 f f f 的字母换成了 R R R 矩阵和 T T T 矩阵来表示。
3 变换矩阵的数学表达式
既然知道了仿射变换的一般表达式,那么在实现不同的变换时, R R R 矩阵和 T T T 矩阵中的各个参数应该如何取值呢?请看下文介绍。
3.1 平移变换
在下图中,第一个子图为原始图像,第二个子图为平移变换:
说明:每个子图中的矩阵就是相应的变换矩阵,我们可以看到此时 R R R 矩阵和 T T T 矩阵的取值。
平移变换就是让 x x x 和 y y y 平移指定的值,其中 R R R 矩阵为单位矩阵, T T T 矩阵为指定的值。
变换矩阵如下:
M = [ 1 0 T x 0 1 T y 0 0 1 ] M=\begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix} M= 100010TxTy1
仿射变换的结果如下:
[ x ′ y ′ 1 ] = [ 1 0 T x 0 1 T y 0 0 1 ] [ x y 1 ] = [ x + T x y + T y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} =\begin{bmatrix} x+T_x \\ y+T_y \\ 1 \end{bmatrix} x′y′1 = 100010TxTy1 xy1 = x+Txy+Ty1
由上式可以看出每个 x x x 都移动了 T x T_x Tx 值,每个 y y y 都移动了 T y T_y Ty 值。
3.2 缩放变换
在下图中,第一个子图为原始图像,第三个子图为缩放变换:
说明:每个子图中的矩阵就是相应的变换矩阵,我们可以看到此时 R R R 矩阵和 T T T 矩阵的取值。
缩放变换就是让图像放大或缩小指定的倍数,其中 R R R 矩阵为对角矩阵, T T T 矩阵为零向量。
变换矩阵如下:
M = [ R 00 0 0 0 R 11 0 0 0 1 ] M=\begin{bmatrix} R_{00} & 0 & 0 \\ 0 & R_{11} & 0 \\ 0 & 0 & 1 \end{bmatrix} M= R00000R110001
仿射变换的结果如下:
[ x ′ y ′ 1 ] = [ R 00 0 0 0 R 11 0 0 0 1 ] [ x y 1 ] = [ R 00 ∗ x R 11 ∗ y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \begin{bmatrix} R_{00} & 0 & 0 \\ 0 & R_{11} & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} =\begin{bmatrix} R_{00}*x \\ R_{11}*y \\ 1 \end{bmatrix} x′y′1 = R00000R110001 xy1 = R00∗xR11∗y1
由上式可以看出每个 x x x 都变为原来的 R 00 R_{00} R00 倍,每个 y y y 都变为原来的 R 11 R_{11} R11 倍。
3.3 旋转变换
在下图中,第一个子图为原始图像,第四个子图为旋转变换:
说明:每个子图中的矩阵就是相应的变换矩阵,我们可以看到此时 R R R 矩阵和 T T T 矩阵的取值。
弧度有点难画,我就不标角度了,请自行脑补😇
参考上图,根据简单的三角函数关系可知:
{ x = cos α y = sin α \left\{\begin{matrix} x=\cos \alpha \\ y=\sin \alpha \end{matrix}\right. {x=cosαy=sinα
① 逆时针旋转
{ x ′ = cos ( α + θ ) = cos α ∗ cos θ − sin α ∗ sin θ = x ∗ cos θ − y ∗ sin θ y ′ = sin ( α + θ ) = sin α ∗ cos θ + cos α ∗ sin θ = y ∗ cos θ + x ∗ sin θ \left\{\begin{matrix} x'=\cos (\alpha+\theta) =\cos \alpha*\cos \theta-\sin \alpha*\sin \theta =x*\cos \theta-y*\sin \theta\\ y'=\sin (\alpha+\theta) =\sin \alpha*\cos \theta+\cos \alpha*\sin \theta =y*\cos \theta+x*\sin \theta \end{matrix}\right. {x′=cos(α+θ)=cosα∗cosθ−sinα∗sinθ=x∗cosθ−y∗sinθy′=sin(α+θ)=sinα∗cosθ+cosα∗sinθ=y∗cosθ+x∗sinθ
因此要求逆时针旋转矩阵 R ′ R' R′ 为:
R ′ = [ cos θ − sin θ sin θ cos θ ] R'=\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \\ \end{bmatrix} R′=[cosθsinθ−sinθcosθ]
② 顺时针旋转
{ x ′ ′ = cos ( α − θ ) = cos α ∗ cos θ + sin α ∗ sin θ = x ∗ cos θ + y ∗ sin θ y ′ ′ = sin ( α − θ ) = sin α ∗ cos θ − cos α ∗ sin θ = y ∗ cos θ − x ∗ sin θ \left\{\begin{matrix} x''=\cos (\alpha-\theta) =\cos \alpha*\cos \theta+\sin \alpha*\sin \theta =x*\cos \theta+y*\sin \theta\\ y''=\sin (\alpha-\theta) =\sin \alpha*\cos \theta-\cos \alpha*\sin \theta =y*\cos \theta-x*\sin \theta \end{matrix}\right. {x′′=cos(α−θ)=cosα∗cosθ+sinα∗sinθ=x∗cosθ+y∗sinθy′′=sin(α−θ)=sinα∗cosθ−cosα∗sinθ=y∗cosθ−x∗sinθ
因此要求逆时针旋转矩阵 R ′ ′ R'' R′′ 为:
R ′ ′ = [ cos θ sin θ − sin θ cos θ ] R''=\begin{bmatrix} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \\ \end{bmatrix} R′′=[cosθ−sinθsinθcosθ]
3.4 反射变换
关于各个轴的反射变换如下图所示:
假设相对 x x x 轴进行反射,那么要求 x x x 保持不变, y y y 变为相反数。变换矩阵如下:
M = [ 1 0 0 0 − 1 0 0 0 1 ] M=\begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{bmatrix} M= 1000−10001
其余的表达式可以自行进行推导。
3.5 剪切变换
关于
x
x
x 轴和
y
y
y 轴的剪切变换如下图所示:
针对关于 x x x 轴的剪切变换,其变换矩阵如下:
M = [ 1 R 01 0 0 1 0 0 0 1 ] M=\begin{bmatrix} 1 & R_{01} & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} M= 100R0110001
仿射变换的结果如下:
[ x ′ y ′ 1 ] = [ 1 R 01 0 0 1 0 0 0 1 ] [ x y 1 ] = [ x + R 01 ∗ y y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \begin{bmatrix} 1 & R_{01} & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} =\begin{bmatrix} x+R_{01}*y \\ y \\ 1 \end{bmatrix} x′y′1 = 100R0110001 xy1 = x+R01∗yy1
由上式可以看出每个 x x x 都移动了 R 01 ∗ y R_{01}*y R01∗y 值,每个 y y y 都保持不变。
说明:可以结合剪切变换的图示来进行理解。它与平移变换的不同之处在于,前者的每个 x x x 是根据自己所对应的 y y y 值来进行移动的,而后者的每个 x x x 都移动一个相同的、指定的值。