数字水印 | 仿射变换的原理入门



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, xX

在二维平面中,仿射变换的一般表达式为:

[ 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} xy1 = 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} [xy]=[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} xy1 = 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} xy1 = 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} xy1 = R00000R110001 xy1 = R00xR11y1

由上式可以看出每个 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θ=xcosθysinθy=sin(α+θ)=sinαcosθ+cosαsinθ=ycosθ+xsinθ

因此要求逆时针旋转矩阵 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θ=xcosθ+ysinθy′′=sin(αθ)=sinαcosθcosαsinθ=ycosθxsinθ

因此要求逆时针旋转矩阵 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= 100010001

其余的表达式可以自行进行推导。



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} xy1 = 100R0110001 xy1 = x+R01yy1

由上式可以看出每个 x x x 都移动了 R 01 ∗ y R_{01}*y R01y 值,每个 y y y 都保持不变。

说明:可以结合剪切变换的图示来进行理解。它与平移变换的不同之处在于,前者的每个 x x x 是根据自己所对应的 y y y 值来进行移动的,而后者的每个 x x x 都移动一个相同的、指定的值。




参考博客



  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值