4. 全局运动估计:平移模型、仿射模型、透视模型,哪种适合手持夜景?

好,咱们进入多帧降噪里一个非常关键的环节——全局运动估计。

你想想看,手持手机拍夜景,手再稳也免不了有微小的抖动。多帧降噪要把几张图对齐,就得先算出帧与帧之间的“位移量”。这个位移量用什么数学模型来描述?这就是全局运动估计要解决的问题。

常见的模型有三种:平移模型、仿射模型、透视模型。到底哪个适合手持夜景?我直接说结论:仿射模型是首选,平移模型做初始化,透视模型慎用。下面我一个个拆开讲。

4.1 三种模型的核心区别

先看一张对比表,心里有个底:

模型 自由度 能描述的变换 计算量 鲁棒性
平移模型 2 (dx, dy) 仅水平+垂直平移 极低 高(但欠拟合)
仿射模型 6 (a~f) 平移+旋转+缩放+剪切 中等 高
透视模型 8 (m~p) 全部+透视畸变 高 低(易过拟合)

核心观点:手持夜景场景下,帧间运动以平移和旋转为主,偶尔带轻微缩放。仿射模型刚好覆盖这些,又不会引入太多参数导致不稳定。

4.2 平移模型:简单但不够用

平移模型是最朴素的。它假设两帧之间只有上下左右的移动,没有旋转、没有缩放。公式长这样:

x' = x + dx
y' = y + dy

就两个参数,dx 和 dy。用相位相关法或者光流法都能快速算出来。

优点很明显:计算快,鲁棒性高。哪怕图像有噪声,平移估计也不容易崩。

缺点也很致命:它处理不了旋转。你手持拍摄时,按下快门的瞬间手腕会有一个微小的转动——平移模型直接歇菜。我做过一个实验,用纯平移模型对齐手持夜景序列,结果边缘区域出现明显的重影,尤其是路灯杆和建筑轮廓,根本没法看。

我的经验:平移模型适合做粗对齐或者初始化。比如先算一个全局平移,把大部分位移去掉,再用更精细的模型做微调。我在项目中经常把平移模型作为“第一步”,给后续的仿射估计提供一个好的起点。

4.3 仿射模型:手持夜景的黄金选择

仿射模型就灵活多了。它用6个参数描述变换:

x' = a*x + b*y + c
y' = d*x + e*y + f

这6个参数能表达:平移(c, f)、旋转(a, b, d, e 的组合)、缩放(a, e 的尺度)、剪切(b, d 的耦合)。

说白了,你手持拍摄时常见的抖动——上下晃、左右转、甚至手机拿近拿远导致的轻微缩放——仿射模型都能搞定。

为什么它适合手持夜景?

  • 自由度适中:6个参数,用4对匹配点就能解。计算量不大,实时性有保障。
  • 能处理旋转:手持抖动最常见的旋转分量,仿射模型完美覆盖。
  • 鲁棒性好:相比透视模型,仿射模型对匹配点中的离群点不那么敏感。我用RANSAC配合仿射模型,即使有30%的错误匹配,依然能稳定估计出运动。

避坑指南:我曾经在夜景强光场景(比如霓虹灯牌)下直接用仿射模型,结果因为局部高光区域的匹配点过于集中,导致全局运动估计偏差。后来我加了空间均匀采样的策略——在全图均匀选取特征点,而不是只挑响应最强的点。效果立竿见影。

4.4 透视模型:精度高但容易翻车

透视模型是8参数模型,公式更复杂:

x' = (m0*x + m1*y + m2) / (m6*x + m7*y + 1)
y' = (m3*x + m4*y + m5) / (m6*x + m7*y + 1)

它能描述透视畸变——比如你拍一个矩形,从侧面看它会变成梯形。这在手持夜景里需要吗?

我的答案是:绝大多数情况不需要。

手持拍摄时,手机和场景之间的距离通常远大于手机的物理尺寸,透视效应微乎其微。你强行用8参数模型去拟合,反而容易出问题:

  • 过拟合:8个参数需要更多匹配点,夜景图像特征点本来就少,容易拟合到噪声上。
  • 计算量大:每次迭代都要解8元方程组,对移动端不友好。
  • 不稳定:匹配点稍微偏差一点,透视参数就剧烈变化。我见过一个案例,用透视模型做夜景对齐,结果因为几棵树的晃动(非刚体运动),整个画面被扭曲成了波浪形。

什么时候用透视模型?只有当你确定场景中有明显的透视变化时才考虑,比如拍一个很近的建筑物,或者手机有明显的俯仰角度变化。但手持夜景——我建议你直接跳过。

4.5 我的推荐方案:分层估计策略

说了这么多,我在实际项目中是怎么做的?给你一个可落地的方案:

  1. 第一步:平移模型粗对齐——用相位相关法快速算出全局平移,把帧间的大位移去掉。这一步计算量极小,几毫秒搞定。
  2. 第二步:仿射模型精对齐——在粗对齐的基础上,用ORB或SIFT提取特征点,RANSAC拟合仿射变换。这一步是关键,能处理旋转和缩放。
  3. 第三步:检查残差——如果仿射模型的对齐残差仍然很大(比如超过2个像素),再考虑是否启用透视模型。但我在手持夜景项目中,99%的情况到第二步就足够了。

下面这张图展示了整个流程:

全局运动估计分层策略流程图 全局运动估计分层策略 输入图像对 平移模型粗对齐(相位相关) 仿射模型精对齐(RANSAC) 输出对齐结果 关键点 • 平移模型:快速去大位移 • 仿射模型:处理旋转+缩放 • 透视模型:仅特殊场景启用

我的习惯:在代码实现中,我会把仿射模型作为默认选项,平移模型作为fallback。如果仿射模型估计出的参数中旋转角度超过5度或者缩放超过1.05倍,我会标记这一帧为“运动过大”,直接丢弃,不参与后续融合。这样可以避免因为剧烈抖动导致的鬼影。

4.6 总结一下

回到最开始的问题:平移、仿射、透视,哪种适合手持夜景?

仿射模型是王道。它平衡了表达能力和鲁棒性,既能处理手持抖动的主要分量(平移+旋转),又不会像透视模型那样容易过拟合。平移模型可以作为预处理步骤,透视模型建议只在特殊场景下启用。