2. 图像拼接基础
图像拼接,说白了就是把多张照片拼成一张大图。听起来简单,但背后有一套严谨的数学逻辑。我刚开始接触这个领域时,也以为就是简单叠图,结果拼出来的图歪七扭八,根本没法看。
后来才明白,核心就两个问题:怎么对齐,怎么融合。这一章我们先啃第一个问题——对齐的数学原理。
单应性矩阵:两张图之间的“映射密码”
假设你拍了两张照片,场景有重叠区域。这两张图之间是什么关系?
如果相机只是绕着光心旋转,或者拍摄的是一个平面场景(比如墙面、地面),那么两张图之间的变换可以用一个 3×3 的矩阵来描述——这就是单应性矩阵(Homography)。
核心公式:
p' = H · p
其中 p 是第一张图上的点 (x, y, 1),p' 是第二张图上的对应点 (x', y', 1),H 就是单应性矩阵。
H 矩阵有 8 个自由度(去掉一个尺度因子)。这意味着,理论上只需要 4 对匹配点就能解出 H。但实际项目中,我从来不用 4 对点——噪声太大。一般我会用 RANSAC 算法,找几十对点,然后筛选出内点再求解。
我的经验:匹配点对数量建议在 20-50 对之间。太少容易过拟合,太多计算量上去了但精度提升有限。我曾经在一个项目中只用了 8 对点,结果拼接处总有错位,后来加到 30 对,问题就解决了。
透视变换:图像怎么“变形”
有了 H 矩阵,下一步就是把一张图映射到另一张图的坐标系里。这个过程叫透视变换(Perspective Transformation)。
透视变换和仿射变换不一样。仿射变换只能做平移、旋转、缩放、剪切,保持平行线还是平行线。但透视变换可以改变“透视感”——你想想看,拍一个矩形墙面,从侧面拍会变成梯形,这就是透视效果。
| 变换类型 | 自由度 | 保持特性 | 典型应用 |
|---|---|---|---|
| 仿射变换 | 6 | 平行线、比例 | 图像配准、简单校正 |
| 透视变换 | 8 | 直线(不保持平行) | 图像拼接、视角校正 |
透视变换的公式展开是这样的:
x' = (h11*x + h12*y + h13) / (h31*x + h32*y + h33)
y' = (h21*x + h22*y + h23) / (h31*x + h32*y + h33)
注意分母不是 1,而是 h31*x + h32*y + h33。这就是透视变换和仿射变换最本质的区别——分母随坐标变化,所以能产生“近大远小”的效果。
避坑指南:我曾经在拼接无人机航拍图时,直接用仿射变换代替透视变换,结果拼接出来的图边缘严重扭曲。后来才发现,无人机虽然飞得高,但地面不是平面,透视效应仍然存在。记住:只要相机有旋转或场景有深度变化,就必须用透视变换。
拼接流程概览:从输入到输出
好了,数学原理讲完了。那整个拼接流程长什么样?我画了一张图,你看一眼就明白了。
整个流程其实就五步:
- 输入图像——保证有足够重叠区域(我一般要求至少 30% 重叠)
- 特征提取——SIFT 精度高但慢,ORB 快但鲁棒性差,看场景选
- 特征匹配 + RANSAC——这一步是去噪的关键,RANSAC 迭代次数设 1000 次以上
- 单应性矩阵估计——用内点做最小二乘,别直接用原始匹配点
- 透视变换 + 融合——变换后做加权融合或多频段融合,消除接缝
我的习惯:在特征匹配阶段,我会先用暴力匹配(Brute-Force)找出所有候选匹配,然后用 RANSAC 筛选。虽然慢一点,但匹配质量有保障。如果追求实时性,可以改用 FLANN 匹配器。
为什么单应性矩阵不能解决所有问题?
嗯,这里要泼一盆冷水。单应性矩阵假设场景是平面,或者相机只有旋转运动。如果你的相机有平移,场景又有深度变化,那单应性矩阵就不够用了——会出现视差(Parallax)问题。
我记得有一次做室内全景拼接,相机平移了 50 厘米,结果拼接处出现了重影。后来改用全局对齐 + 局部光流校正才解决。
所以,单应性矩阵是基础,但不是万能药。遇到复杂场景,需要更高级的模型(比如 Bundle Adjustment 或网格变形)。这些我们后面章节会细讲。
一句话总结:单应性矩阵解决“怎么对齐”的问题,透视变换解决“怎么变形”的问题,两者配合,才能把两张图拼到一起。