跳至主要内容

仿射变换详解:性质与应用

了解仿射变换的定义、公式、关键性质、齐次坐标,以及其在图形学、计算机视觉、机器人学与数据预处理中的应用。
· 14分钟 阅读

使用 AI 探索

仿射变换是一种通过施加线性变换与平移(translation)来将空间中的点映射到新位置的过程。您可以先旋转、缩放、切变、反射,再整体平移,而直线仍将保持为直线。 

仿射变换无处不在,因为它能刻画多种保持物体几何结构的变化,同时计算成本低廉。

仿射变换的多样化应用

仿射变换的多样化应用。图片来源:Napkin AI

这一思想起源于数学家如 Leonhard Euler 和 August Ferdinand Möbius 对“当其他量改变时,哪些性质保持不变”的探索。 

如今,它已成为数字世界的关键组成,从网页的 CSS 到复杂的医学成像,处处可见其身影。

什么是仿射变换?

仿射变换介于“纯线性代数”和“现实世界几何”之间。它在允许平移的同时保持数学形式整洁,而仅靠线性映射无法实现平移。

理解仿射空间与仿射变换

一个向量空间有一个特殊点称为原点(即使不画出来,概念上它也存在)。在向量空间中,向量可相加与数乘,并有一个特定的“零向量”。

一个仿射空间看起来像一个没有选定原点的向量空间。您仍可以讨论:

  • 点(位置)
  • 位移向量(点与点之间,例如“从 P 到 Q”)
  • 向点加上一个向量(按该位移移动该点)

但您无法有意义地相加两个点,因为点的相加依赖于原点的选择。

形式上,向量空间 V 上的仿射空间 A 是一个具有 V 自由且传递作用的点集。通俗地说:点之差属于 V,但单个点本身不属于 V。

一个仿射变换是仿射空间之间的映射,它保持仿射组合(后文详述),并在几何上保持直线与平行关系。

仿射变换公式:基于向量空间的定义

在坐标下,仿射变换具有如下形式:

矩阵形式的仿射变换。 

其中:

  • x ∈ Rn 是输入点(列向量)
  • A ∈ Rn×n 是表示线性部分(旋转、缩放、切变、反射及其组合)的矩阵
  • b ∈ Rn 是表示平移

这种“线性 + 常量”的结构使仿射映射在工程与计算中广受欢迎:表达力强,同时应用快速且稳定。

仿射变换的关键性质

仿射变换在允许形状拉伸或倾斜的同时,保留若干“结构性”的几何关系。

仿射变换会保留哪些性质?

仿射变换所保留的性质

仿射变换所保留的性质。图片来源:Napkin AI

保留:

  1. 共线性:变换前在同一直线上的点,变换后仍在一条直线上。
  2. 平行性:平行直线保持平行(在图形与制图中尤为重要)。
  3. 凸性:凸形仍保持凸。
  4. 线段内比:若一点按某比分割线段,该比例被保留。

表达上述性质的一种巧妙方式是仿射组合:

仿射映射会保留这些组合。

不保留(一般情况下):

  • 距离
  • 角度
  • 面积/体积(除非满足特殊条件)

最后,仿射变换在复合运算下封闭:先后施加两个仿射变换,结果仍为仿射变换。

仿射变换的群结构

仿射变换在复合下形成一个群(常称为仿射群,记作 Aff(n))。

当满足如下条件时,

且

则

这仍是仿射变换。 

关于可逆性的说明: Ax+b 可逆 当且仅当 A 可逆(det(A)≠0)。 此时:

因此您获得了一种强大的代数工具:通过串联简单变换构建复杂变换,并在需要时将其反转。

仿射变换矩阵

为高效计算仿射变换,我们使用矩阵——特别是齐次坐标,它以与矩阵兼容的方式处理平移。

仿射变换矩阵的一般形式

在 n 维中,变换如下:

其中

  • A 控制形状变化(线性部分)。

  • b 控制位移(平移)。

可逆性的要求是矩阵 A 必须可逆。简单说,如果 A 将所有点压缩到一条直线上(秩降低),则无法唯一地反演。

齐次坐标与增广矩阵表示

仅靠一个 (n × n) 矩阵作用于 x,无法表示平移。齐次坐标通过引入一个附加坐标来解决这个问题。

将 2D 点 ((x, y)) 表示为 ((x, y, 1))。

则 2D 仿射变换变为一个3×3 矩阵:

利用齐次坐标进行 2D 仿射变换(3×3 矩阵)。来源:作者

利用齐次坐标进行 2D 仿射变换(3×3 矩阵)。来源:作者

优势:

  • 复合简化为乘法(只需矩阵乘法)。
  • 流水线优化(图形与视觉库偏好此方式)。
  • 对平移、旋转、缩放与切变的一致管理。

仿射变换的类型

多数实践中的仿射变换只涉及少数几个步骤。 

仿射变换中的平移

平移将每个点按同一位移移动:T(x)=x+b

2D 的齐次形式为:

以齐次变换矩阵表示的平移(2D)。来源:作者

以齐次变换矩阵表示的平移(2D)。来源:作者

该形式用于图形学(移动对象)、机器人学(改变坐标系)及计算机视觉(图像配准)。

缩放变换:一致与非一致

一致缩放:在 2D 中,一致缩放表示各方向使用相同因子 s: 

2D 一致缩放矩阵。来源:作者

2D 一致缩放矩阵。来源:作者

非一致缩放:

2D 非一致缩放矩阵。来源:作者

2D 非一致缩放矩阵。来源:作者

3D 缩放则对应 3×3 对角矩阵。缩放保持直线与平行,但会改变距离(除非 s=1)。

2D 与 3D 的旋转变换

2D 按角度(theta)旋转:

按角度进行 2D 旋转变换。来源:作者

按角度进行 2D 旋转变换。来源:作者

在 3D 中旋转是围绕某一轴(x、y 或 z)进行,并有相应矩阵。将平移与旋转叠加仍为仿射(若仅有旋转与平移,则为“刚体运动”)。

切变变换详解

切变会将形状“倾斜”。一个 2D x-切变为:

2D x-切变表示。来源:作者

2D x-切变表示。来源:作者

y-切变为:

2D y-切变表示。来源:作者

2D y-切变表示。来源:作者

切变常用于排版、视觉变形,以及看起来具有透视效果的特效(不过真正的透视是射影而非仿射)。 

仿射几何中的反射变换

绕过原点的坐标轴或平面进行反射,属于线性反射(因此也是仿射)。

相对于 x 轴的 2D 反射:

相对于 x 轴的 2D 反射。来源:作者

相对于 x 轴的 2D 反射。来源:作者

相对于 y 轴:

相对于 y 轴的 2D 反射。来源:作者

相对于 y 轴的 2D 反射。来源:作者

反射会改变物体的朝向,有助于分析对称性、识别模式与处理几何。

如何复合与求逆仿射变换

在实际系统中,您很少只使用单一变换;通常会将多个变换串联起来。

复合多个仿射变换

设:

且

则:

顺序很重要。先旋转后平移与先平移后旋转并不相同。这是因为平移会被后续矩阵“捕获”。

一个便于记忆的方法:

  • 若使用齐次矩阵,复合即为矩阵乘法
  • 最后施加的变换在乘法左侧。

仿射变换的逆:计算与应用

对于

若 A 可逆:

在视觉任务中常用此法:通常将输出像素反向映射回输入像素(逆向映射)以填补空洞。

线性变换 vs. 仿射变换

仿射变换可理解为“带内置平移的线性变换”。

线性与仿射变换的关键区别

一个线性变换 L(x)=Ax 必须满足:

  • L(0)=0(原点映为原点)
  • L(x+y)=L(x)+L(y)
  • L(cx)=cL(x)

一个仿射变换 T(x)=Ax+b:

  • 不要求将 0 映为 0
  • 保持直线与平行关系
  • 在去除平移后呈线性作用

每个线性映射都是仿射(取 b=0),但并非所有仿射映射都是线性(任意非零平移都会破坏线性)。

仿射变换即线性加平移

您可以将其重写为:

即“先做线性部分(Ax),再加平移(b)。” 

如果您见过 (y=mx+c),其实已熟悉其一维形式。这也是仿射映射常见于神经网络的原因:全连接层计算 (Wx+b),即仿射映射,随后再叠加非线性。 

计算机图形学与计算机视觉广泛使用仿射变换。

计算机图形与计算机视觉中的仿射变换

在这里,仿射变换不再抽象,而是直接“创造价值”。

利用仿射变换进行图像变换与扭曲

在图像处理里,仿射变换用于:

  • 旋转与缩放
  • 平移(移动图像)
  • 倾斜校正(切变)
  • 配准/对齐(匹配图像)

两个重要的实现思路:

  • 前向映射:将每个输入像素前推,可能产生空洞。
  • 反向映射:对每个输出像素反向查找其来源位置;通常更优。

由于映射坐标往往不落在整数像素上,插值很重要。常见方法有:

  • 最近邻:最快,但块状感明显
  • 双线性:更平滑,通常为默认
  • 双三次:更平滑,但计算量更大

3D 图形与渲染中的仿射变换

仿射变换在 3D 图形中无处不在:

  • 模型变换(对象局部 → 世界)
  • 观察变换(世界 → 相机)
  • 投影准备(在射影步骤前执行仿射部分)

一个细致但重要的点:当缩放非一致时,表面法线并不总像点那样变化。为确保光照正确,渲染管线通常对法线使用线性部分的逆转置。

机器人学中的仿射变换

机器人学几乎就是坐标系统的“无处不在”。

仿射变换映射:

  • 机器人基座坐标 ↔ 机械臂坐标 ↔ 末端执行器坐标
  • 相机坐标 ↔ 世界坐标
  • 激光雷达 ↔ 车辆坐标

在基于视觉的定位(如视觉里程计)中,帧间的小幅运动常可在图像空间局部近似为仿射,这有助于跟踪与估计运动。

坐标空间映射与数据归一化

在机器学习中,特征缩放往往是仿射的:

  • Min-max 缩放:(x' = alpha x + beta)
  • 标准化:(x' = (x-μ)/σ)(也是仿射)

这很重要,因为许多模型(尤其是基于梯度的)在特征量纲相近时表现更好。

仿射变换的进阶概念与理论

仿射变换起初看似简单,但其理论十分深刻,尤其当您开始关注如面积等不变量或替代坐标系时。

仿射变换高级概念。图片来源:Napkin AI

仿射变换高级概念。图片来源:Napkin AI

仿射几何与重心坐标

重心坐标将一点表示为三角形顶点的加权混合:

这些坐标具有仿射不变性,即若以仿射方式同时改变三角形与该点,λi 保持不变。

因此重心坐标广泛用于:纹理映射、网格插值与有限元分析。

保测度与等面积仿射变换

当且仅当如下条件成立时,仿射变换保面积(2D)或体积(3D):

A 的行列式告诉您在线性部分作用下面积或体积改变多少。

若(|det(A)| > 1),空间被放大;若小于 1,则被缩小。若为负,朝向发生改变(类似反射)。这些对可视化、物理仿真与变形建模至关重要。

仿射几何中的相似变换与等距变换

关系:

  • 仿射:(Ax+b)(一般情形)
  • 相似:缩放 + 旋转 + 平移(保持角度不变,尺度不定)
  • 等距(刚体):旋转 + 平移(保持距离与角度)

因此:等距变换 ⊂ 相似变换 ⊂ 仿射变换

该层次结构便于根据问题选择合适模型。例如若必须保持距离,仿射就过于宽泛。

射影变换与更高维的仿射扩展

仿射变换是射影变换的一种。射影变换可建模透视效果,如平行线在远处相交的消失点;仿射变换无法做到这一点。

在齐次坐标中,射影变换允许最后一行比 ([0,0,1]) 更一般。这种更大的自由度让透视效果得以实现。

仿射概念同样适用于更高维,例如 3D 图形中的 4D 齐次变换。

实现仿射变换

仿射变换“数学简单”,但使用方式会决定成败。

仿射变换的数值稳定性与精度

常见问题:

  • 近奇异矩阵:若 det(A) 接近 0,求逆将不稳定 
  • 浮点误差累积:反复复合可能漂移
  • 极端缩放:过大或过小的尺度会降低精度。

最佳实践:

  • 将条件数(或至少 |det(A)|)作为预警指标。 
  • 求逆时选用稳定的库,如 NumPy、Eigen。
  • 在图形或机器人等需大量连续操作的场景中,重新正交归一化旋转矩阵。

仿射变换的 GPU 实现与并行处理

仿射变换天然适合并行化,意味着每个点或像素可独立变换。这使其非常适合 SIMD 与 GPU 内核。

因此图像扭曲与渲染管线非常适合 GPU:可同时执行大量乘加运算。

常见优化包括:使用融合乘加(FMA)操作、批处理变换、减少内存传输次数。 

仿射变换的专业应用与扩展

仿射变换对许多任务而言“刚好够用”,也常作为更灵活模型的基础。

用于非刚性配准的 B 样条仿射变换

在形态度量学与医学影像中,纯仿射对齐只是第一步。粗对齐之后,基于 B 样条的形变模型可在易于理解的控制点下实现平滑的非刚性扭曲。

可以这样理解:仿射负责整体摆正,B 样条处理局部微调。

模式识别与计算机视觉中的仿射不变性

许多识别系统力求具备仿射不变性,以便在视角以近似仿射的方式变化时仍能识别对象。 

相关技术包括:

  • 使用仿射不变特征(或归一化图像块)
  • 为关键点估计局部仿射框架
  • 设计对倾斜与尺度鲁棒的描述子

这让匹配、跟踪与检索等操作更可靠。

GIS 与大地坐标系统中的仿射变换

在 GIS 中,仿射变换用于地图地理配准、对齐不同来源的图层,或作为坐标转换的局部近似。

真实的大地测量学变换往往更复杂,但仿射模型常作为局部近似或更大流程的一部分。

仿射变换的软件库 

无需从零开始;大多数生态系统都有良好支持。

在 Python、C++ 与 Java 中实现仿射变换

  • Python:矩阵计算用 NumPy;图像扭曲用 OpenCV;数值工具用 SciPy。 
  • C++:Eigen(线性代数)、OpenCV(视觉)、GLM(图形数学)
  • Java:Apache Commons Math,以及依栈选择的视觉工具包

跨语言的核心思路:

  1. 用向量表示点
  2. 应用 (Ax+b)(或齐次矩阵乘法)
  3. 用矩阵乘法复合变换。 
  4. 需要时用 (A-1) 反转。

仿射变换的最佳工具与库

仿射变换的最佳工具与库。图片来源:Napkin AI

仿射变换的最佳工具与库。图片来源:Napkin AI

广泛使用的工具:

  • OpenCV:warpAffine、getAffineTransform、estimateAffine2D(视觉流程)
  • NumPy:通用矩阵运算
  • Eigen:高性能 C++ 线性代数
  • GLM / DirectXMath:面向图形的数学库
  • GDAL / PROJ(GIS):坐标转换与地理空间流程

请根据领域选择:图像用 OpenCV,图形用 GLM,GIS 用 GDAL/PROJ。

关于仿射变换的另一种视角

换一种说法,有时更容易理解相同的理念。

替代定义:仿射映射与仿函数

仿射映射可定义为保持仿射组合“神圣性”的函数:

此表述不依赖于某一特定原点,非常契合“仿射几何”的精神,也直接表明了直线映为直线。

仿射变换与 (y = mx + b) 公式

若仿射变换显得抽象,不妨联系已知内容:(y=mx) 是线性的(过原点),而 (y=mx+b) 是仿射的(斜率效应相同且带有平移)。

在更高维中,m 变为矩阵 A,但故事相同:线性作用,再加上位移。

结语

归根结底,仿射变换就是:“我会保留由直线和平行边构成的世界,但不保证角度保持不变。”

如果您正以矩阵和线性系统的视角思考,不妨看看 Linear Algebra for Data Science in R 以及聚焦矩阵的教程,包括 Row Echelon Form Explained。

若您想进入计算机视觉领域,可以参考项目 Food Image Classification with Hugging Face 以及课程 Working with Hugging Face,作为不错的下一步。

Vikash Singh

作者

Vikash Singh

在数据科学、人工智能、分析与数据战略方面经验丰富的专业人士。

FAQs

什么是仿射变换?

仿射变换用 T(x)=Ax+bT 将点映射,其中 A 为线性变换,b 为平移。它将旋转、缩放、切变、反射与平移统一在一个框架中。

仿射变换与线性变换有何不同?

线性变换写作 L(x)=Ax,必须将原点映为自身。仿射变换包含平移(b≠0),因此可以移动原点。

仿射变换保留哪些几何性质?

仿射变换保留直线、共线性与平行性,从而保持“线性结构”。它也保留同一直线上的距离比(例如中点仍为中点)。

哪些性质不被保留?

距离与角度通常会变化,即形状可能被拉伸或扭曲。面积与体积也可能变化,除非满足行列式条件。

机器学习中的特征缩放是仿射变换吗?

是的——标准化与 min-max 缩放都是仿射映射。它们在不大幅改变关系的前提下,调整坐标以利于优化。

主题