多帧融合原理:多帧曝光序列、短曝光与长曝光、帧对齐技术、鬼影消除基础
多帧融合,说白了就是让手机或相机拍好几张不同亮度的照片,然后合成一张。你想想看,一张照片既要暗部有细节,又要亮部不过曝,单张怎么可能做到?所以就有了多帧这条路。
我个人习惯把多帧融合比作「厨师做菜」。短曝光是生菜,脆但寡淡;长曝光是炖肉,浓郁但容易糊。怎么把这两样东西端上同一张桌子,就是咱们今天要聊的核心。
核心一句话:多帧融合的本质是「用时间换动态范围」。用多张不同曝光的帧,把场景的亮度信息完整地记录下来。
2.1 多帧曝光序列:为什么要拍多张?
单帧传感器的动态范围,通常只有 60-70dB。而真实世界的亮度跨度,动不动就 120dB 以上。你想想看,一个场景里既有阳光直射的窗户,又有阴影里的沙发,单帧根本顾不过来。
多帧曝光序列就是解决这个问题的。我们让传感器以不同的曝光时间或增益,连续抓取多帧图像。每一帧只负责记录场景中的一段亮度区间。
| 帧类型 | 曝光时间 | 负责的亮度区间 | 典型应用场景 |
|---|---|---|---|
| 短曝光帧 | 1/1000s - 1/200s | 高亮区域(天空、灯光) | 防止高光过曝 |
| 中曝光帧 | 1/200s - 1/30s | 中间调(人脸、物体) | 保证主体清晰 |
| 长曝光帧 | 1/30s - 1s | 暗部区域(阴影、夜景) | 提升暗部信噪比 |
我在项目中遇到过一种情况:拍夜景时,长曝光帧的暗部噪点特别多。后来发现是曝光时间太长,传感器热噪声上来了。嗯,这里要注意,长曝光不是越长越好,得考虑 sensor 的噪声特性。
2.2 短曝光与长曝光:一对欢喜冤家
短曝光和长曝光,就像一对性格完全相反的搭档。短曝光帧速度快,能冻结运动,但暗部全是噪点。长曝光帧细节丰富,但一动就糊。
为什么短曝光帧的暗部噪点多?因为曝光时间短,光子收集得少,信号弱。信号弱的时候,读出噪声和散粒噪声就特别明显。说白了,信噪比不够。
长曝光帧正好相反。曝光时间长,光子收集得多,信号强,信噪比高。但代价是——运动模糊。手持拍摄时,手抖一下,长曝光帧就糊了。
我的经验:在实际工程中,短曝光帧的曝光时间通常设置为长曝光帧的 1/16 到 1/64。这个比例能保证两帧之间的亮度重叠区域足够大,方便后续融合时的权重计算。
我曾经踩过一个坑:为了追求暗部细节,把长曝光帧的增益调得特别高。结果暗部是亮了,但噪点也炸了。后来我学乖了,宁愿多拍一帧中曝光,也不把增益推到极限。
2.3 帧对齐技术:让多帧「对齐」再说融合
多帧融合的前提是:每一帧的像素必须对应场景中的同一个物理点。但手持拍摄时,手会抖,场景里可能有运动物体。所以,融合之前必须先做帧对齐。
帧对齐的核心是运动估计。我们以某一帧为参考帧,计算其他帧相对于参考帧的运动矢量。常用的方法有两种:
- 全局运动估计:假设整幅图像的运动是一致的(比如平移、旋转)。适合三脚架或轻微手抖的场景。
- 局部运动估计:把图像分成块,逐块计算运动矢量。适合有运动物体的场景。
我个人习惯用局部运动估计,因为真实场景里很少有纯全局运动。你想想看,拍一张街景,背景是静止的,但行人可能在走动。全局运动估计根本处理不了这种情况。
注意:帧对齐不是万能的。如果运动幅度太大(比如快速甩镜头),或者运动物体太小(比如远处的人影),对齐算法很容易失效。这时候就需要靠后面的鬼影消除来兜底。
帧对齐的流程大致是这样的:
输入:参考帧 Ref,待对齐帧 Cur
输出:对齐后的帧 Aligned
1. 将 Ref 和 Cur 下采样到低分辨率(比如 1/4 尺寸)
2. 在低分辨率上做块匹配,得到粗运动矢量
3. 将粗运动矢量上采样到原分辨率
4. 在原分辨率上做亚像素精调
5. 根据运动矢量对 Cur 进行 warp(重采样)
6. 输出 Aligned
嗯,这里要注意,亚像素精调这一步很关键。如果只做整像素对齐,融合后的图像边缘会有锯齿感。我一般用双线性插值做亚像素 warp,效果还不错。
2.4 鬼影消除基础:别让运动物体「分身」
鬼影是什么?就是融合后的图像里,同一个物体出现了多个半透明的影子。比如拍一张街景,长曝光帧里有个行人走过,短曝光帧里没有。融合后,行人就变成了一个「鬼影」。
鬼影消除的基本思路是:检测出哪些区域存在运动,然后对这些区域做特殊处理,不让它们参与融合。
常用的鬼影消除方法有:
- 基于运动检测的剔除:计算每一帧与参考帧的差异,差异大的区域标记为运动区域,直接丢弃这些区域的像素。
- 基于权重的抑制:不直接丢弃,而是给运动区域的像素分配很低的权重,让它们对融合结果的贡献变小。
- 基于深度学习的检测:用神经网络直接预测哪些区域是运动区域。效果最好,但计算量也最大。
我在项目中用过基于运动检测的剔除。说实话,这个方法简单粗暴,但容易误判。比如树叶被风吹动,或者水面波光粼粼,这些区域会被误判为运动区域,导致融合后的图像出现「空洞」。
避坑指南:我曾经在拍瀑布时吃过亏。瀑布的水流是运动的,但又不是「鬼影」。如果直接用运动检测剔除,瀑布就变成了一团模糊。后来我改用基于权重的抑制,给水流区域分配中等权重,既保留了瀑布的流动感,又避免了鬼影。
鬼影消除的流程可以概括为:
输入:对齐后的多帧图像序列
输出:无鬼影的融合图像
1. 选择参考帧(通常是中曝光帧)
2. 对每一帧,计算与参考帧的差异图
3. 对差异图做阈值处理,生成运动掩膜
4. 对运动掩膜做形态学滤波(膨胀、腐蚀),去除孤立噪点
5. 根据运动掩膜,调整每一帧的融合权重
6. 执行加权融合,输出最终图像
嗯,这里要注意,形态学滤波这一步不能省。如果不做,运动掩膜上会有很多小洞,融合后的图像会出现「斑点」状的伪影。
总结一下:多帧融合的核心是「对齐 + 融合」。对齐解决的是「位置不对应」的问题,鬼影消除解决的是「内容不一致」的问题。两者缺一不可。
这张图把多帧融合的流程串起来了。从多帧曝光序列开始,经过帧对齐、鬼影检测、权重计算,最后到加权融合。每一步都环环相扣,哪一步出了问题,最终结果都会打折扣。