4. 全局运动模型:平移模型、仿射变换、透视变换、模型选择的原则
各位同学,咱们今天聊聊全局运动模型。说白了,就是怎么用数学公式来描述两张图之间的“整体位移”。你想想看,手持相机拍HDR序列,手抖、风吹、甚至按快门那一下的震动,都会让画面整体偏移。这时候,我们就需要一个模型来“对齐”它们。
我个人习惯把全局运动模型分成三个档次:平移、仿射、透视。档次越高,能描述的变形越复杂,但计算量也越大。选哪个?嗯,这里要注意,不是越复杂越好,关键看你的场景和需求。
4.1 平移模型:最简单,也最常用
平移模型,就是假设图像只有水平和垂直方向的移动,没有旋转、没有缩放。公式很简单:
x' = x + dx
y' = y + dy
其中 (dx, dy) 就是我们要估计的偏移量。这个模型只有2个自由度,计算起来飞快。
我在项目中遇到过一个典型的场景:用三脚架固定相机拍HDR。理论上相机纹丝不动,但实际因为反光板震动或者风吹,还是会有几个像素的偏移。这时候用平移模型就足够了,又快又准。
4.2 仿射变换:能处理旋转和缩放
仿射变换比平移模型多了一个“花样”——它可以描述旋转、缩放、剪切。公式长这样:
x' = a*x + b*y + c
y' = d*x + e*y + f
这里有6个自由度(a, b, c, d, e, f)。你可以把它想象成:先旋转一个角度,再缩放一下,最后平移。平行线在仿射变换后仍然是平行线。
我曾经在手持拍摄的HDR序列里吃过亏。当时用平移模型去对齐,结果发现边缘总是对不齐,后来一查,原来是拍摄时手不自觉地旋转了相机。换成仿射变换后,问题迎刃而解。
4.3 透视变换:最强大,也最“贵”
透视变换,也叫单应性变换,是全局运动模型里的“大哥大”。它能描述任意四边形到四边形的映射,包括透视效果。公式是:
x' = (a*x + b*y + c) / (g*x + h*y + 1)
y' = (d*x + e*y + f) / (g*x + h*y + 1)
这里有8个自由度。你看分母里多了 (g*x + h*y + 1) 这一项,这就是透视效果的来源。平行线在透视变换后可能不再平行,会汇聚到一点。
说实话,透视变换在HDR多帧对齐里用得不算多。为什么?因为计算量大,而且容易过拟合。你想想看,如果两张图之间只是简单的平移,你用8个自由度的模型去拟合,反而可能引入不必要的变形。
- 相机有明显的“摇摆”运动(比如手持相机大幅度移动)
- 场景中有明显的透视变形(比如拍摄建筑物)
- 其他模型对齐后,残差仍然很大
4.4 模型选择的原则:我的“三步走”策略
讲了这么多,到底怎么选?我总结了一个“三步走”策略,分享给大家:
- 先试平移模型。 如果对齐后的图像在重叠区域的平均误差小于0.5像素,那就用平移模型。简单、稳定、快。
- 不行再试仿射变换。 如果平移模型误差大,或者你发现图像有明显的旋转/缩放,那就升级到仿射变换。
- 最后才考虑透视变换。 只有当前两种模型都搞不定,而且你确认场景有透视变形时,才用透视变换。
我个人习惯在代码里做一个自动选择:先算平移模型的误差,如果误差超过阈值,自动切换到仿射变换;如果仿射变换的误差还是大,再尝试透视变换。这样既保证了效率,又不会漏掉复杂情况。
4.5 知识体系图:全局运动模型一览
下面这张图总结了三种模型的关系和选择逻辑,你可以把它当作一个快速参考:
4.6 实际项目中的选择建议
最后,我根据多年的项目经验,给大家一个更具体的参考表:
| 拍摄方式 | 推荐模型 | 理由 |
|---|---|---|
| 三脚架 + 遥控快门 | 平移模型 | 几乎无运动,平移足够 |
| 手持拍摄(白天) | 仿射变换 | 有轻微旋转和缩放 |
| 手持拍摄(夜景) | 平移模型 | 噪声大,复杂模型容易过拟合 |
| 无人机航拍 | 透视变换 | 视角变化大,透视变形明显 |
嗯,关于全局运动模型,今天就聊到这里。记住一句话:模型是工具,不是目的。选对模型,你的HDR重建就成功了一半。