整理范围:齐次坐标、平移/旋转/缩放、相似变换、仿射变换、投影变换
一、为什么要做"图像的变换与校正"
实际采集到的画面会因为相机位置、镜头畸变、拍摄角度等因素,与"理想中的画面"存在差异。
定义 :用数学建模方法描述图像的位置、大小、形状等已知条件 → 确定模型参数 → 根据模型对图像做几何校正。
把歪的、偏的、变形的图像"掰回"理想状态。
二、齐次坐标(Homogeneous Coordinate)
2.1 引入
普通二维坐标 (x,y)(x, y)(x,y) 只能表示 线性变换 (缩放、旋转),表示不了 平移(平移是加法,不是乘法)。
齐次坐标的做法:在二维向量末尾加一个 1,把 (x,y)(x, y)(x,y) 升级成三维向量 (x,y,1)(x, y, 1)(x,y,1)。这样 平移、旋转、缩放都能统一写成矩阵乘法。
2.2 基本形式
x1y11=M⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix} = M \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =M⋅ x0y01
其中 MMM 是一个 3×3 变换矩阵。所有几何变换都通过左乘这个矩阵完成。
末尾多一个 1,所有变换都变成矩阵乘法,方便编程实现。
三、三种基本几何变换
3.1 平移(Translation)

点 p0(x0,y0)p_0(x_0, y_0)p0(x0,y0) 沿 x 方向移 TxT_xTx、沿 y 方向移 TyT_yTy:
{x1=x0+Txy1=y0+Ty \begin{cases} x_1 = x_0 + T_x \\ y_1 = y_0 + T_y \end{cases} {x1=x0+Txy1=y0+Ty
矩阵形式:
x1y11=10Tx01Ty001⏟T⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix}}_{T} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =T 100010TxTy1 ⋅ x0y01
平移参数 Tx,TyT_x, T_yTx,Ty 放在矩阵第三列。
3.2 旋转(Rotation)

点绕原点旋转 γ\gammaγ 角(逆时针为正):
{x1=x0cosγ−y0sinγy1=x0sinγ+y0cosγ \begin{cases} x_1 = x_0 \cos\gamma - y_0 \sin\gamma \\ y_1 = x_0 \sin\gamma + y_0 \cos\gamma \end{cases} {x1=x0cosγ−y0sinγy1=x0sinγ+y0cosγ
矩阵形式:
x1y11=cosγ−sinγ0sinγcosγ0001⏟R⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{R} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =R cosγsinγ0−sinγcosγ0001 ⋅ x0y01
注意 :图像坐标系 y 轴向下时,顺时针/逆时针方向会反过来,实际代码中以 Halcon / OpenCV 的约定为准。
效果:图像绕原点旋转后,四角会露出黑色背景
3.3 缩放(Scaling)

x 方向缩放 SxS_xSx 倍,y 方向缩放 SyS_ySy 倍:
{x1=Sx⋅x0y1=Sy⋅y0 \begin{cases} x_1 = S_x \cdot x_0 \\ y_1 = S_y \cdot y_0 \end{cases} {x1=Sx⋅x0y1=Sy⋅y0
矩阵形式:
x1y11=Sx000Sy0001⏟S⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{S} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =S Sx000Sy0001 ⋅ x0y01
- Sx=Sy>1S_x = S_y > 1Sx=Sy>1:等比例放大(如 2 倍放大,3×3 网格变 6×6)
- Sx=Sy<1S_x = S_y < 1Sx=Sy<1:等比例缩小(如 6×6 网格变 3×3)
- Sx≠SyS_x \neq S_ySx=Sy:非等比例缩放(横向、纵向拉伸程度不同)
四、几何变换的层级体系
平移(translation)
↓
欧氏变换(Euclidean) = 平移 + 旋转 (刚体变换,形状大小都不变)
↓
相似变换(similarity) = 平移 + 旋转 + 等比例缩放
↓
仿射变换(affine) = 平移 + 旋转 + 缩放 + 切变
↓
投影变换(projective) = 直线仍映射为直线,但平行线不再平行
规律:越往下,保留的几何性质越少,能表达的变形越复杂

五、相似变换(Similarity Transformation)
5.1 定义
变换过程中 形状保持不变(大小、方向、位置可变)。
任何相似变换都可以分解为:等比例缩放 × 旋转 × 平移 的组合。
5.2 矩阵分解
x1y11=10xt01yt001⏟平移⋅cosγ−sinγ0sinγcosγ0001⏟旋转⋅s000s0001⏟等比例缩放⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} 1 & 0 & x_t \\ 0 & 1 & y_t \\ 0 & 0 & 1 \end{bmatrix}}{\text{平移}} \cdot \underbrace{\begin{bmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \end{bmatrix}}{\text{旋转}} \cdot \underbrace{\begin{bmatrix} s & 0 & 0 \\ 0 & s & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{\text{等比例缩放}} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =平移 100010xtyt1 ⋅旋转 cosγsinγ0−sinγcosγ0001 ⋅等比例缩放 s000s0001 ⋅ x0y01
5.3 分块形式
三个矩阵相乘后可以合并写成:
M=sRT01 M = \begin{bmatrix} sR & T \\ 0 & 1 \end{bmatrix} M=sR0T1
| 分块 | 尺寸 | 含义 |
|---|---|---|
| sRsRsR | 2×2 | 旋转 + 等比例缩放 |
| TTT | 2×1 | 平移向量 |
| 000 | 1×2 | 固定为 0, 0 |
| 111 | 1×1 | 固定为 1 |
整体仍是 3×3 矩阵,自由度为 4(缩放 1 个 + 旋转 1 个 + 平移 2 个)
六、仿射变换(Affine Transformation)
6.1 定义
变换过程中 保持直线和平行线不变(平行线映射后仍是平行线)。
任何仿射变换都可以分解为:缩放 + 平移 + 旋转 + 切变(Shearing) 的组合。
通俗理解:允许图形任意倾斜,并且允许在 x、y 两个方向上独立伸缩。

6.2 通用矩阵形式
x′y′1=abcdef001⏟M⋅xy1 \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix}}_{M} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 =M ad0be0cf1 ⋅ xy1
- 最后一行固定为
[0, 0, 1] - 前两行有 6 个未知参数(a, b, c, d, e, f)
- 自由度为 6,需要 3 对不共线的点 才能求解
6.3 常见仿射变换子类型

| 变换类型 | 矩阵(前两行示意) | 效果 |
|---|---|---|
| 恒等 Identity | [1 0 0; 0 1 0] |
图像不变 |
| 平移 Translation | [1 0 X; 0 1 Y] |
整体移动 (X, Y) |
| 旋转 Rotation | [cosθ sinθ; -sinθ cosθ] 形式 |
绕原点转 θ 角 |
| 等比例缩放 Isotropic Scaling | [s 0 0; 0 s 0] |
x、y 同比例缩放 |
| 非等比例缩放 Scaling | [W 0 0; 0 H 0] |
x 方向宽 W,y 方向高 H |
| 反射 Reflection | 带 -1 元素 |
关于原点/x轴/y轴对称翻转 |
| 切变 Shear | 带 tanφ 元素 |
图形倾斜(平行四边形化) |
6.4 切变(Shearing)详解

切变是仿射变换相比相似变换 多出来的能力,分为两种:
x 方向切变 (图形沿 x 方向倾斜 φ 角):
Mx=1tanϕ0010001 M_x = \begin{bmatrix} 1 & \tan\phi & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} Mx= 100tanϕ10001
- 效果:原来的点 (1,0)(1, 0)(1,0) 仍在原地,点 (0,1)(0, 1)(0,1) 被推到 (tanϕ,1)(\tan\phi, 1)(tanϕ,1)
- 平行线仍然平行,但矩形变成平行四边形
y 方向切变(图形沿 y 方向倾斜 ψ 角):
My=100tanψ10001 M_y = \begin{bmatrix} 1 & 0 & 0 \\ \tan\psi & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} My= 1tanψ0010001
6.5 反射(Reflection)三种形式
| 反射类型 | 矩阵 | 效果 |
|---|---|---|
| 关于原点反射 | [-1 0 0; 0 -1 0; 0 0 1] |
上下左右都翻转 |
| 关于 x 轴反射 | [1 0 0; 0 -1 0; 0 0 1] |
上下翻转 |
| 关于 y 轴反射 | [-1 0 0; 0 1 0; 0 0 1] |
左右翻转 |

七、投影变换(Projective Transformation)
7.1 定义
变换过程中 直线仍然映射为直线,但不再保证平行线平行。
- 二维投影变换:用 3×3 可逆矩阵 表示
- 三维投影变换:用 4×4 可逆矩阵 表示
7.2 例子
现实中两条铁轨是平行的,但在照片中会向远处汇聚到一个消失点------这就是投影变换的效果(平行线不再平行)

7.3 矩阵形式(二维)
M=m11m12m13m21m22m23m31m32m33 M = \begin{bmatrix} m_{11} & m_{12} & m_{13} \\ m_{21} & m_{22} & m_{23} \\ m_{31} & m_{32} & m_{33} \end{bmatrix} M= m11m21m31m12m22m32m13m23m33
- 与仿射变换的区别:最后一行不再是 0, 0, 1 ,m31,m32m_{31}, m_{32}m31,m32 可以不为零
- 自由度为 8(3×3 矩阵有 9 个元素,但齐次坐标下整体缩放不产生新变换)
- 需要 4 对点 才能求解
八、三种变换对比
| 对比项 | 相似变换 | 仿射变换 | 投影变换 |
|---|---|---|---|
| 保持直线 | ✅ | ✅ | ✅ |
| 保持平行线 | ✅ | ✅ | ❌ |
| 保持形状 | ✅ | ❌(可切变、非等比缩放) | ❌ |
| 可分解为 | 等比缩放 + 旋转 + 平移 | 缩放 + 旋转 + 平移 + 切变 | 更一般的 3×3 矩阵 |
| 矩阵形式 | [sR T; 0 1] |
[a b c; d e f; 0 0 1] |
任意 3×3 可逆矩阵 |
| 自由度 | 4 | 6 | 8 |
| 求解需要点数 | 2 对 | 3 对不共线 | 4 对 |
| 典型应用 | 图像平移、旋转、缩放 | 矫正倾斜、车牌校正 | 透视畸变校正、广角镜头去畸变 |
九、主要矩阵
9.1 矩阵形式汇总
| 变换 | 矩阵 M |
|---|---|
| 平移 | 10Tx01Ty001\begin{bmatrix}1&0&T_x\\0&1&T_y\\0&0&1\end{bmatrix} 100010TxTy1 |
| 旋转 | cosγ−sinγ0sinγcosγ0001\begin{bmatrix}\cos\gamma&-\sin\gamma&0\\\sin\gamma&\cos\gamma&0\\0&0&1\end{bmatrix} cosγsinγ0−sinγcosγ0001 |
| 缩放 | Sx000Sy0001\begin{bmatrix}S_x&0&0\\0&S_y&0\\0&0&1\end{bmatrix} Sx000Sy0001 |
| 相似 | scosγ−ssinγTxssinγscosγTy001\begin{bmatrix}s\cos\gamma&-s\sin\gamma&T_x\\s\sin\gamma&s\cos\gamma&T_y\\0&0&1\end{bmatrix} scosγssinγ0−ssinγscosγ0TxTy1 |
| 仿射 | abcdef001\begin{bmatrix}a&b&c\\d&e&f\\0&0&1\end{bmatrix} ad0be0cf1 |
| 投影 | m11m12m13m21m22m23m31m32m33\begin{bmatrix}m_{11}&m_{12}&m_{13}\\m_{21}&m_{22}&m_{23}\\m_{31}&m_{32}&m_{33}\end{bmatrix} m11m21m31m12m22m32m13m23m33 |
9.2 解题思路(求校正参数)
- 找已知对应点:在原图和理想图上各取若干对应点
- 列方程:每对点提供 2 个方程(x 方向、y 方向各一个)
- 解矩阵 :
- 相似变换:2 对点
- 仿射变换:3 对点
- 投影变换:4 对点
- 重映射:用求得的矩阵对每个像素做坐标变换,得到校正后图像
十、易混点
- 齐次坐标为什么加 1? ------ 为了把平移也写成矩阵乘法,统一所有变换的表示形式。
- 相似 vs 仿射的本质区别 ------ 相似只能"等比例缩放 + 旋转 + 平移",图形形状不变;仿射还能切变、x/y 独立伸缩,矩形可以变平行四边形。
- 仿射 vs 投影的本质区别 ------ 仿射保持平行关系(平行线还是平行线);投影不保证平行。
- 旋转矩阵的符号 ------ 取决于 y 轴方向(数学 y 向上 / 图像 y 向下),实际编程时以库函数为准,不要死记正负号。
- 自由度与点数关系 ------ 自由度越高,能表达的变形越复杂,但需要的已知点也越多。

