069、多帧合成与夜景模式:手持长曝光的工程化挑战
069、多帧合成与夜景模式:手持长曝光的工程化挑战
一、一个让我失眠的夜景bug
2019年某旗舰机项目,夜景模式在实验室测了三个月,PSNR、SSIM指标漂亮得能拿奖。结果灰度测试第一天,用户反馈就炸了:拍路灯,灯杆变成两根;拍月亮,月亮拖出彗星尾巴;拍人像,人脸糊成梵高油画。
我连夜调出raw数据,发现一个诡异现象——多帧对齐模块在暗光下疯狂抖动。不是传感器抖动,是算法自己“抽风”:相邻帧之间的位移估计,在低信噪比区域会出现随机跳变。更致命的是,这种跳变在ISP pipeline里被当成真实运动,触发了运动补偿的“过度修正”,最终导致鬼影。
这个bug让我意识到:多帧合成从来不是简单的“拍一堆照片叠起来”,而是一场与物理极限的博弈。今天这篇笔记,就聊聊那些年我们在手持长曝光上踩过的坑。
二、多帧合成的底层逻辑:别被“堆栈”两个字骗了
很多人以为多帧合成就是“拍N张,平均一下”。真这么干,噪点确实能降,但手抖造成的模糊也会被平均进去——结果就是一张“均匀模糊”的照片,还不如单帧锐化。
真正的多帧合成,核心是三个步骤的闭环:运动估计 → 对齐融合 → 降噪增强。但工程化时,每一步都是坑。
运动估计:别用全局仿射,局部运动才是魔鬼
早期方案用全局仿射模型(比如单应性矩阵)做对齐,在静态场景下效果还行。但一旦画面里有树叶晃动、行人走动、甚至风吹头发丝,全局模型就崩了——它会强行把局部运动当成相机抖
