坐标变换基础:四种变换的数学含义
图像配准说白了就是找两张图之间的“映射关系”。这个映射关系用数学语言描述,就是坐标变换。我记得刚入行时,总以为所有配准都一样,结果在医学图像上翻了车——不同模态的图像变形方式天差地别。所以我们得先把四种基本变换搞清楚。
变换类型全景图
先看一张总图,把四种变换放在一起对比,你就能理解它们各自能“做什么、不能做什么”。
1. 刚体变换
刚体变换是最简单的一类。它只包含旋转和平移。形状大小都不变,就像你手里拿着一张纸,在桌面上挪动或转动。
数学形式是 2×2 旋转矩阵加上平移向量。在 2D 中表示为:
x' = cosθ · x - sinθ · y + tx
y' = sinθ · x + cosθ · y + ty
写成矩阵:
[x'] [cosθ -sinθ] [x] [tx]
[y'] = [sinθ cosθ] [y] + [ty]
自由度只有 3 个:一个旋转角度 θ,两个平移分量 tx、ty。你要是用刚体变换去配准一个被拉伸过的图像,那肯定失败——因为它没法处理缩放。
我遇到过这么个事:一个卫星遥感项目,两张图拍的是同一片区域,但拍摄角度和高度略有不同。一开始我用刚体配,误差很大。后来发现其实存在微小的尺度和透视变形——所以果断换成了仿射变换。
2. 仿射变换
仿射变换比刚体多了一些自由度。它支持旋转、平移、缩放、错切(shear)。矩形变换后可能变成平行四边形,但平行直线还是平行。
数学形式:
[x'] [a11 a12] [x] [tx]
[y'] = [a21 a22] [y] + [ty]
其中 a11~a22 这 4 个参数组合起来控制缩放、旋转和剪切。加上 2 个平移,总共 6 个自由度。
实际代码里我们用齐次坐标统一表达:
[x'] [a11 a12 tx] [x]
[y'] = [a21 a22 ty] [y]
[1 ] [ 0 0 1] [1]
3. 投影变换
投影变换也叫透视变换或单应性变换。它比仿射多一个能力:让平行线在变换后可以相交,产生透视效果。你想想看,一个长方形被投影后在照片上变成梯形,这就是投影变换能做到的事。
齐次坐标形式(8 自由度):
[x'] [h11 h12 h13] [x]
[y'] = [h21 h22 h23] [y]
[w'] [h31 h32 1 ] [1]
实际输出坐标:
x_final = x' / w'
y_final = y' / w'
注意分母 w' 是由 h31 和 h32 决定的,这就产生了“透视除法”。
投影变换需要至少 4 对匹配点才能解算。我记得有一次做车载环视拼接,用仿射总是配不准地面标线,换成投影变换后,四幅图像完美融合到俯视图上。但注意:投影变换仍然保持直线是直线——它不能把直线变曲线。
4. 非线性变换
这是最灵活也最复杂的一类。非线性变换允许局部畸变,每个像素点都可以有独立的位移。它不保持直线,也不保持平行性。
数学上用位移场表示:
x' = x + u(x, y)
y' = y + v(x, y)
其中 u(x,y) 和 v(x,y) 是两个随空间变化的函数,可以是多项式、B样条、TPS(薄板样条)或基于物理模型的形式。
举个常见例子,医学图像里的非线性配准:
// 常用模型:B样条自由形变 (FFD)
// 用控制网格上的位移系数插值得到全图位移
Φ = {φ_ij} (网格控制点)
u(x,y) = Σ B_i(x) B_j(y) · φ_ij_x
v(x,y) = Σ B_i(x) B_j(y) · φ_ij_y
表格:四种变换对比
| 变换类型 | 自由度 | 保留特征 | 常用场景 | 最低点数 |
|---|---|---|---|---|
| 刚体 | 3 | 距离、角度、形状 | 相机固定平移/旋转 | 2对点 |
| 仿射 | 6 | 平行线、直线 | 遥感、航空影像 | 3对点 |
| 投影 | 8 | 直线(不保平行) | 全景拼接、透视校正 | 4对点 |
| 非线性 | 很高 | 不保任何特征 | 医学变形、非刚性配准 | 大量点 |
我的选择策略
在实际项目中,我一般这样选:
- 先分析图像之间变形的来源。是传感器静止(刚体)?有尺差(仿射)?视角不同(投影)?还是组织变形(非线性)?
- 从最低自由度开始试,用少量匹配点验证配准误差。如果均方根误差(RMSE)小于0.5像素,就够用了。
- 只有低自由度变换不行时,再往上走。曾经有一个CBCT和规划CT的配准任务,我用投影变换误差1.2mm,换非线性配准(TPS)降到0.3mm。但代价是计算时间从0.5秒涨到了15秒。
- 刚体:检查是否有旋转/平移之外的形变?有→升级
- 仿射:检查平行线是否还保持平行?不保持→投影
- 投影:检查直线是否变弯?变弯→非线性
- 非线性:检查位移场是否平滑?否则加正则化