2、多帧合成技术原理:从信号处理角度理解叠加、对齐与融合
多帧合成,说白了就是「拍一堆,合成一张」。但为什么不是简单地把几张图叠在一起就行?这里面的门道,得从信号处理的角度来拆解。
我刚开始接触这个领域时,也以为就是做个平均。结果第一次在暗光下拍夜景,合成出来的照片全是重影,还不如单张。后来才明白,多帧合成的核心是三个步骤:叠加、对齐、融合。每一步都有它的物理意义和数学逻辑。
2.1 叠加:为什么能降噪?
先问一个问题:为什么多张照片叠加能降低噪点?
这得从噪声的统计特性说起。传感器上的噪声,尤其是暗光下的热噪声和读出噪声,基本是随机且独立的。而信号(你拍的主体)是确定且相关的。
假设你拍了 N 张完全对齐的照片,每张照片在同一个像素位置的亮度值为:
I_i = S + N_i
其中 S 是真实信号,N_i 是第 i 张的噪声。噪声的均值为 0,标准差为 σ。
当你把这 N 张照片叠加平均:
I_avg = (1/N) * Σ(S + N_i) = S + (1/N) * ΣN_i
根据大数定律,噪声的均值会趋近于 0,而噪声的标准差会变成 σ/√N。
关键结论:叠加 N 张照片,信噪比提升 √N 倍。4 张照片,信噪比提升 2 倍;16 张照片,提升 4 倍。
我在项目中遇到过一个问题:有人觉得拍 30 张比 15 张好一倍,其实不是。信噪比的提升是平方根关系,拍到后面边际效益递减。我个人习惯是暗光下拍 8-16 张,再多就划不来了。
2.2 对齐:手持拍摄的噩梦
叠加的前提是「完全对齐」。但手持拍摄,怎么可能不动?
你想想看,哪怕你屏住呼吸,心跳都会让手机有微小的位移。更别说风吹、手抖、按快门的瞬间冲击。这些位移如果不处理,叠加出来的照片就是重影。
对齐算法要解决两个问题:
- 全局位移:整个画面平移或旋转(比如你身体轻微晃动)
- 局部位移:画面中某个物体在动(比如树叶被风吹、行人走过)
我常用的对齐策略分两步走:
- 粗对齐:用相位相关法或特征点匹配,估算全局的平移和旋转量。这一步速度快,能解决大部分手持抖动。
- 精对齐:用光流法或块匹配,逐像素计算局部运动。这一步计算量大,但能处理移动物体。
我的经验:粗对齐用下采样后的低分辨率图做,速度快很多。精对齐只在运动区域做,别全图跑一遍,否则手机发烫。
这里有个坑——我曾经在拍夜景人像时,发现人脸总是糊的。后来排查发现,是人物轻微的呼吸导致面部轮廓有像素级的位移。普通的块匹配算法把这种位移当成了噪声去平均,结果反而模糊了。后来我改用基于网格的局部对齐,把画面分成 16x16 的网格,每个网格独立计算运动矢量,再插值平滑,才解决了这个问题。
2.3 融合:不只是平均那么简单
对齐之后,怎么把多张图合成一张?
最简单的做法是像素级平均。但这样做有两个问题:
- 如果某张图在某个区域对齐不准,平均后会出现鬼影
- 所有像素一视同仁,暗部噪点虽然被压制了,但亮部细节也可能被平滑掉
所以,真正的融合算法要聪明得多。我把它分为三个层次:
| 融合策略 | 原理 | 适用场景 | 缺点 |
|---|---|---|---|
| 均值融合 | 所有像素等权平均 | 静态场景、三脚架拍摄 | 无法处理运动、鬼影 |
| 中值融合 | 取每个像素位置的中位数 | 有少量运动物体(如行人) | 计算量大,细节有损失 |
| 加权融合 | 根据像素质量动态分配权重 | 手持暗光、复杂场景 | 算法复杂,需要质量评估 |
我个人最常用的是加权融合。具体来说,对每个像素位置,我计算它在各张图中的「质量分数」,包括:
- 梯度强度:梯度大的区域说明细节丰富,权重应该高
- 运动一致性:如果某张图在这个像素的运动矢量与周围不一致,说明对齐不准,权重降低
- 曝光度:过曝或欠曝的像素权重降低
然后,每个像素的最终值就是各张图的加权和。这样做的好处是:暗部区域靠多张平均降噪,亮部区域靠梯度高的那张保留细节。
注意:加权融合的权重图一定要做高斯平滑,否则会出现拼接痕迹。我吃过这个亏——第一次实现时没平滑权重,结果合成出来的照片像打了马赛克。
2.4 核心流程:一张图看懂
下面这张图总结了多帧合成的完整信号处理流程。从多张输入到一张输出,每一步都在处理信号与噪声的博弈。
2.5 信号处理视角的总结
从信号处理的角度看,多帧合成本质上是一个时域滤波过程:
- 叠加是低通滤波,压制高频噪声
- 对齐是信号配准,确保各帧的同一像素对应同一物理点
- 融合是自适应加权,在降噪和保细节之间找平衡
这三个步骤缺一不可。对齐做不好,融合就是白搭;融合策略不对,叠加再多张也没用。
一句话总结:多帧合成不是简单的「拍多张求平均」,而是一个信号处理系统——对齐解决不确定性,融合解决非均匀性,叠加解决信噪比。