什么是仿射变换

什么是仿射变换

什么是仿射变换?

仿射变换(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′​]=[a11​a21​​a12​a22​​][xy​]+[tx​ty​​]

这里:

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​]+[tx​ty​​]

2. 缩放(Scaling)

缩放会调整图形的大小,其变换矩阵为:

A=[sx00sy]

\mathbf{A} =

\begin{bmatrix}

s_x & 0 \\

0 & s_y

\end{bmatrix}

A=[sx​0​0sy​​]

其中 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=[1ky​​kx​1​]

其中 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​​=​a11​a21​0​a12​a22​0​tx​ty​1​​​xy1​​

在齐次坐标中,仿射变换矩阵可以同时表示旋转、缩放、剪切和平移,使得所有操作都可以用矩阵乘法统一处理。

仿射变换的性质

保持直线性:

仿射变换会将直线映射为直线,保持图形的基本结构。

保持比例性:

仿射变换不会改变线段之间的比例关系。

角度可能变化:

仿射变换可能改变角度和形状,但不会破坏共线性或共面性。

仿射变换的应用

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)

总结

仿射变换是一种重要的几何变换工具,能够以线性方式对图形进行平移、缩放、旋转和剪切操作。它在计算机视觉、图像处理和深度学习中有广泛的应用。通过理解其数学原理和性质,我们可以更好地控制和优化相关任务中的数据处理和变换过程。

关于作者: admin

相关推荐

到底要不要去外包公司?这篇带你全面了解外包那些坑!
世界杯历史上,最能代表小人物奋斗历程的球队
一、马云为何不戴红帽

一、马云为何不戴红帽

365bet亚洲版登陆首页 08-05