什么是仿射变换?
仿射变换(Affine Transformation)是一种几何变换,它是一组保持平直性和比例性的线性变换和平移的组合。简单来说,仿射变换会将直线映射为直线,保持线段之间的比例关系,但可能会改变图形的角度和大小。
仿射变换广泛应用于计算机视觉、图像处理、深度学习等领域。例如,在图像旋转、缩放、平移、剪切等操作中,仿射变换是核心工具。
仿射变换的数学定义
仿射变换可以用以下公式表示:
y=Ax+b
\mathbf{y} = \mathbf{A} \mathbf{x} + \mathbf{b}
y=Ax+b
其中:
x\mathbf{x}x:原始坐标(输入向量),通常是一个 nnn-维向量。y\mathbf{y}y:变换后的坐标(输出向量)。A\mathbf{A}A:变换矩阵(线性部分),是一个 n×nn \times nn×n 的矩阵。b\mathbf{b}b:平移向量,决定了位置的平移。
在 2D 平面中,仿射变换可表示为:
[x′y′]=[a11a12a21a22][xy]+[txty]
\begin{bmatrix}
x' \\
y'
\end{bmatrix}
=\begin{bmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix}
+
\begin{bmatrix}
t_x \\
t_y
\end{bmatrix}
[x′y′]=[a11a21a12a22][xy]+[txty]
这里:
x,yx, yx,y:原始坐标。x′,y′x', y'x′,y′:变换后的坐标。a11,a12,a21,a22a_{11}, a_{12}, a_{21}, a_{22}a11,a12,a21,a22:线性变换的参数(例如缩放、旋转、剪切)。tx,tyt_x, t_ytx,ty:平移参数。
仿射变换的基本操作
仿射变换由一系列基本操作组合而成,包括:
1. 平移(Translation)
平移是简单的移动位置。其变换矩阵为:
y=x+b
\mathbf{y} = \mathbf{x} + \mathbf{b}
y=x+b
例如,在 2D 平面中:
[x′y′]=[xy]+[txty]
\begin{bmatrix}
x' \\
y'
\end{bmatrix}
=\begin{bmatrix}
x \\
y
\end{bmatrix}
+
\begin{bmatrix}
t_x \\
t_y
\end{bmatrix}
[x′y′]=[xy]+[txty]
2. 缩放(Scaling)
缩放会调整图形的大小,其变换矩阵为:
A=[sx00sy]
\mathbf{A} =
\begin{bmatrix}
s_x & 0 \\
0 & s_y
\end{bmatrix}
A=[sx00sy]
其中 sx,sys_x, s_ysx,sy 是在 xxx 和 yyy 方向的缩放因子。
3. 旋转(Rotation)
旋转会绕某个点进行角度的变化,其变换矩阵为:
A=[cosθ−sinθsinθcosθ]
\mathbf{A} =
\begin{bmatrix}
\cos\theta & -\sin\theta \\
\sin\theta & \cos\theta
\end{bmatrix}
A=[cosθsinθ−sinθcosθ]
其中 θ\thetaθ 是逆时针旋转的角度。
4. 剪切(Shear)
剪切会改变图形的形状,例如将矩形变成平行四边形。其变换矩阵为:
A=[1kxky1]
\mathbf{A} =
\begin{bmatrix}
1 & k_x \\
k_y & 1
\end{bmatrix}
A=[1kykx1]
其中 kx,kyk_x, k_ykx,ky 是剪切因子。
仿射变换的矩阵形式(齐次坐标)
为了方便处理平移,仿射变换通常使用 齐次坐标 表示,将 nnn-维向量扩展为 n+1n+1n+1 维。其通用形式为:
[x′y′1]=[a11a12txa21a22ty001][xy1]
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
=\begin{bmatrix}
a_{11} & a_{12} & t_x \\
a_{21} & a_{22} & t_y \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
x′y′1=a11a210a12a220txty1xy1
在齐次坐标中,仿射变换矩阵可以同时表示旋转、缩放、剪切和平移,使得所有操作都可以用矩阵乘法统一处理。
仿射变换的性质
保持直线性:
仿射变换会将直线映射为直线,保持图形的基本结构。
保持比例性:
仿射变换不会改变线段之间的比例关系。
角度可能变化:
仿射变换可能改变角度和形状,但不会破坏共线性或共面性。
仿射变换的应用
1. 图像处理
图像的旋转、缩放、平移和剪切操作。图像增强和数据扩增(Data Augmentation)。
2. 计算机视觉
图像对齐和配准。目标检测中窗口变换。
3. 深度学习
数据增强中常用仿射变换来生成更多样本。
4. 游戏与图形学
模型变换(例如物体的平移、旋转和缩放)。
PyTorch 中的仿射变换
PyTorch 提供了一些工具来进行仿射变换,例如 torch.nn.functional.affine_grid 和 torch.nn.functional.grid_sample。
示例:应用仿射变换到图像
import torch
import torch.nn.functional as F
# 定义仿射变换矩阵(旋转+平移)
theta = torch.tensor([
[0.866, -0.5, 0.0], # cos(30°), -sin(30°), tx=0
[0.5, 0.866, 0.0] # sin(30°), cos(30°), ty=0
]).unsqueeze(0) # 添加 batch 维度
# 创建仿射网格
grid = F.affine_grid(theta, size=(1, 1, 5, 5)) # 输出大小 (batch, channel, height, width)
# 应用仿射变换
input_image = torch.rand(1, 1, 5, 5) # 随机生成 5x5 的图像
output_image = F.grid_sample(input_image, grid)
print("Transformed Image:", output_image)
总结
仿射变换是一种重要的几何变换工具,能够以线性方式对图形进行平移、缩放、旋转和剪切操作。它在计算机视觉、图像处理和深度学习中有广泛的应用。通过理解其数学原理和性质,我们可以更好地控制和优化相关任务中的数据处理和变换过程。