2. 图像几何变换基础:平移、旋转、缩放、仿射变换、透视变换的数学表示与矩阵形式
图像几何变换是图像变形补偿与几何校正的理论基石。无论是镜头畸变校正、图像配准、全景拼接,还是数字稳像,其底层运算最终都归结为像素坐标的重新映射。理解平移、旋转、缩放、仿射变换与透视变换的数学本质,以及它们在齐次坐标下的矩阵表达,是后续设计补偿算法、评估校正精度、优化插值策略的前提。本章将从线性代数的视角,系统梳理各类变换的数学表示、矩阵形式及其内在联系,并重点剖析仿射变换与透视变换在工程应用中的差异。
2.1 齐次坐标:统一变换表达的基础
在欧几里得几何中,平移变换无法直接表示为 2×2 矩阵与向量的乘法,因为平移是加法运算而非线性映射。为了将平移、旋转、缩放等变换统一为矩阵乘法形式,我们引入齐次坐标(Homogeneous Coordinates)。其核心思想是将二维平面上的点 (x, y) 表示为三维向量 (x, y, 1),即增加一个恒为 1 的附加维度。这样,二维空间中的任意线性变换加上平移,就可以通过一个 3×3 矩阵作用于齐次坐标向量来完成。
齐次坐标的引入并非仅仅为了数学上的优雅,它带来了两个关键工程优势:其一,变换的级联(复合)可以通过矩阵乘法直接实现,避免了多次函数调用的开销与误差累积;其二,透视变换中的除法操作(即 w 分量归一化)可以被自然地纳入矩阵框架,使得投影变换也能用统一的矩阵语言描述。在图像处理库(如 OpenCV、MATLAB)中,所有几何变换函数均以齐次矩阵作为核心参数,理解这一点是正确调用 API 的前提。
2.2 基本变换的矩阵表示
2.2.1 平移变换
平移是最简单的几何变换,将图像中每个像素点沿 x 轴方向移动 tx,沿 y 轴方向移动 ty。其齐次坐标矩阵形式为:
| 1 0 tx |
| 0 1 ty |
| 0 0 1 |
平移矩阵的逆矩阵只需将 tx、ty 取负即可。在图像校正中,平移常用于将图像中心移至坐标原点,以便后续旋转或缩放操作围绕图像中心进行,避免图像内容偏移出视野。
2.2.2 旋转变换
绕原点逆时针旋转角度 θ 的变换矩阵为:
| cosθ -sinθ 0 |
| sinθ cosθ 0 |
| 0 0 1 |
旋转矩阵是正交矩阵,其逆矩阵等于转置矩阵,即 R⁻¹ = Rᵀ。这一性质在图像配准中非常有用——当我们需要反向旋转时,直接取转置即可,无需重新计算三角函数。需要注意的是,图像坐标系通常以左上角为原点,y 轴向下,因此正角度方向与数学惯例相反,实际应用中需根据坐标系定义调整符号。
2.2.3 缩放变换
沿 x 轴缩放 sx 倍,沿 y 轴缩放 sy 倍的矩阵为:
| sx 0 0 |
| 0 sy 0 |
| 0 0 1 |
当 sx = sy 时称为各向同性缩放,保持图像纵横比;当 sx ≠ sy 时称为各向异性缩放,会导致图像拉伸变形。在图像校正中,缩放常用于统一不同来源图像的尺寸,或补偿镜头焦距差异带来的尺度变化。缩放矩阵的逆矩阵为对角线元素取倒数。
2.2.4 复合变换与变换顺序
实际工程中,单一变换很少独立使用。例如,绕图像中心 (cx, cy) 旋转的操作需要三步:先将中心平移到原点,再旋转,最后平移回去。其复合矩阵为:
M = T(cx, cy) · R(θ) · T(-cx, -cy)
这里矩阵乘法的顺序至关重要:先作用的变换矩阵位于乘法表达式的右侧。由于矩阵乘法不满足交换律,变换顺序的颠倒会产生完全不同的结果。在编写代码时,务必确认所使用的库函数是“先乘后”还是“后乘先”的约定。
| 变换类型 | 矩阵形式(3×3) | 自由度 | 不变性质 | 典型应用 |
|---|---|---|---|---|
| 平移 | [1 0 tx; 0 1 ty; 0 0 1] | 2 | 形状、大小、方向 | 图像对齐、坐标原点移动 |
| 旋转 | [cosθ -sinθ 0; sinθ cosθ 0; 0 0 1] | 1 | 长度、角度、面积 | 图像摆正、方向校正 |
| 缩放 | [sx 0 0; 0 sy 0; 0 0 1] | 2 | 平行性、角度(各向同性时) | 分辨率统一、尺度归一化 |
| 仿射 | [a b tx; c d ty; 0 0 1] | 6 | 平行性、直线性 | 倾斜校正、局部配准 |
| 透视 | [a b c; d e f; g h 1] | 8 | 直线性(共线点映射后仍共线) | 梯形校正、视角变换 |
2.3 仿射变换:线性变换与平移的统一
仿射变换是平移、旋转、缩放、剪切(Shear)的组合,其矩阵形式为 2×3 矩阵(在齐次坐标下为 3×3 矩阵,第三行为 [0 0 1])。仿射变换最重要的几何性质是保持平行性:原本平行的直线在变换后仍然平行。这意味着矩形经过仿射变换后变为平行四边形,但不会变为任意四边形。仿射变换有 6 个自由度(4 个线性参数 + 2 个平移参数),因此理论上只需 3 组不共线的对应点对即可唯一确定变换矩阵。
在图像几何校正中,仿射变换常用于处理由相机倾斜、扫描仪畸变等引起的整体线性变形。例如,文档扫描图像的倾斜校正,通常通过检测文本行的倾斜角度,构造旋转矩阵进行反向校正。然而,仿射变换无法处理由于透视投影引起的“近大远小”效应——当相机光轴不垂直于目标平面时,图像中的平行线会汇聚于消失点,此时必须使用透视变换。
2.4 透视变换:模拟人眼视觉的投影模型
透视变换(又称投影变换或单应性变换)是最一般的二维平面变换,其矩阵为 3×3 矩阵,但第三行不再固定为 [0 0 1],而是包含两个非零参数 g 和 h。透视变换的齐次坐标表达式为:
| x' | | a b c | | x |
| y' | = | d e f | | y |
| w' | | g h 1 | | 1 |
实际输出坐标为 (x'/w', y'/w')。当 g 和 h 不为零时,w' 不等于 1,从而产生非线性缩放效果。透视变换有 8 个自由度(矩阵整体缩放不影响变换结果,故归一化一个元素),需要 4 组不共线的对应点对来求解。透视变换保持直线性(直线映射后仍为直线),但不保持平行性,也不保持长度比例。
在图像变形补偿中,透视变换是镜头畸变校正、图像拼接、增强现实(AR)中平面标记跟踪的核心工具。例如,当相机以一定角度拍摄矩形屏幕时,屏幕在图像中呈现为梯形,通过透视变换可以将梯形映射回矩形,实现“正面化”校正。
2.5 变换矩阵的求解与参数估计
在实际校正任务中,我们通常不知道变换矩阵的具体参数,而是需要通过图像中的特征点对应关系来估计。对于仿射变换,使用 3 组对应点即可建立 6 个线性方程,通过求解线性方程组得到 6 个参数。对于透视变换,则需要 4 组对应点建立 8 个方程(每组点提供 2 个方程),求解 8 个未知数。
当对应点数量多于最小需求时(例如通过特征匹配得到 50 对匹配点),问题转化为超定方程组的求解。此时通常采用最小二乘法或 RANSAC(随机采样一致性)算法来估计变换矩阵,以抵抗误匹配点的干扰。RANSAC 的基本流程为:随机选取最小样本集(仿射 3 对、透视 4 对)计算变换矩阵,统计所有匹配点在该矩阵下的内点数量,迭代多次后保留内点最多的模型,最后用所有内点重新估计矩阵以提升精度。
2.6 案例拆解:文档图像梯形校正
假设我们使用手机拍摄了一张放置在桌面上的 A4 文档照片,由于拍摄角度并非垂直俯视,文档在图像中呈现为梯形。目标是校正为正面视角,便于 OCR 识别。已知文档的四个角点在图像中的像素坐标分别为:左上 (180, 240)、右上 (620, 200)、右下 (650, 480)、左下 (150, 520)。期望校正后的文档尺寸为 600×800 像素,对应角点坐标为:左上 (0, 0)、右上 (600, 0)、右下 (600, 800)、左下 (0, 800)。
求解步骤如下:
- 建立 4 组对应点对,代入透视变换方程,构造 8 元线性方程组。
- 使用高斯消元法或 SVD 分解求解 3×3 矩阵的 8 个未知参数。
- 对输出图像中的每个像素坐标 (u, v),计算其在输入图像中的对应位置 (x, y) = M⁻¹ · (u, v, 1)ᵀ。
- 由于计算出的坐标通常为浮点数,需采用双线性插值或三次插值获取像素值。
实际执行中,我们使用 OpenCV 的 getPerspectiveTransform(srcPoints, dstPoints) 函数获取矩阵,再调用 warpPerspective 完成重映射。校正后,文档边缘变为直线且与图像边界平行,OCR 识别准确率显著提升。该案例的代价是校正过程引入了插值误差,图像边缘区域可能出现轻微模糊,可通过使用更高阶插值算法(如 Lanczos)缓解。
2.7 常见误区与总结复盘
在图像几何变换的学习与工程实践中,以下误区值得特别关注:
- 变换顺序混淆: 矩阵乘法不满足交换律,先旋转后平移与先平移后旋转的结果完全不同。建议在代码中明确注释每一步变换的意图,并使用矩阵级联而非逐像素计算。
- 坐标系原点差异: 数学中通常以图像中心为原点,而图像处理库(如 OpenCV)默认以左上角为原点。直接套用数学公式会导致旋转后图像严重偏移,需先平移到中心再旋转。
- 忽视插值影响: 几何变换本身不改变像素值,但重采样过程必然引入插值误差。对于放大操作,最近邻插值会产生锯齿;对于缩小操作,直接采样可能导致混叠,应使用区域插值或金字塔方法。
- 透视变换的过度使用: 当变形本质为仿射时,使用透视变换虽然也能拟合,但会引入不必要的非线性畸变,且对噪声更敏感。应通过残差分析判断模型复杂度是否匹配。