3. 夜景模式算法原理:多帧降噪、HDR与亮度增强

夜景模式,说白了就是让手机在暗光下拍出能看的照片。你想想看,传感器就那么点大,进光量有限,单帧拍出来不是噪点满天飞就是暗成一片。高通平台的解决方案很直接——用多帧换质量。

我个人习惯把夜景算法拆成三个核心模块:多帧降噪(MFNR)、HDR合成和亮度增强。这三个模块不是独立工作的,它们之间有很强的依赖关系。我在项目中遇到过不少因为流程顺序搞错导致效果崩掉的案例,后面会细说。

3.1 多帧降噪(MFNR)——夜景的基石

MFNR,全称Multi-Frame Noise Reduction。原理很简单:拍多张图,对齐后叠加平均。为什么能降噪?因为噪声是随机的,信号是确定的。叠加N帧,信号强度变成N倍,噪声强度只变成√N倍,信噪比就提升了√N倍。

信噪比提升公式:

SNR提升 = 10 * log10(N) dB,其中N为叠加帧数

4帧叠加 → 6dB提升,8帧叠加 → 9dB提升,16帧叠加 → 12dB提升

但这里有个坑——帧数不是越多越好。我曾经在骁龙855平台上试过32帧叠加,结果手抖造成的运动模糊完全没法看。嗯,这里要注意:帧数受限于手持稳定性和场景运动。

MFNR的关键步骤

  1. Burst采集:连续抓取N帧RAW图,帧间隔通常控制在30-50ms
  2. 全局运动估计:用陀螺仪数据做粗对齐,补偿手持抖动
  3. 局部运动匹配:分块做光流或块匹配,处理场景中的运动物体
  4. 时域滤波:对对齐后的像素做加权平均,运动区域降低权重
  5. 空域后处理:对合成结果做边缘保留滤波,去除残留噪声

我的经验:局部运动匹配是MFNR的瓶颈。高通平台上有HVX向量扩展可以用,我建议把块匹配算法写成HVX指令,能快3-5倍。别用纯CPU做,帧率扛不住。

3.2 HDR合成——拉回高光细节

夜景场景经常有高动态范围——霓虹灯招牌亮得刺眼,地面暗得看不清。单帧曝光根本顾不过来。HDR合成的思路是:拍多帧不同曝光的图,把亮部用短曝光帧的细节,暗部用长曝光帧的细节。

高通平台的HDR合成通常分两种模式:

模式 帧数 曝光策略 适用场景
标准HDR 3帧 短-中-长曝光 普通夜景带灯光
超级HDR 5-7帧 多级曝光阶梯 极端高反差场景

HDR合成的核心是权重映射。每个像素的最终值由多帧加权得到,权重取决于像素的亮度、对比度和运动状态。我踩过一个坑:权重图没做时域平滑,结果合成出来的天空出现带状伪影,像水波纹一样。后来加了高斯金字塔多尺度融合才解决。

避坑指南:我曾经在HDR合成时直接用了线性权重,结果亮部过渡区域出现明显的拼接痕迹。后来改用sigmoid曲线做权重映射,过渡自然多了。记住:权重函数要平滑,不能有突变。

3.3 亮度增强——把暗部提亮但不放大噪声

MFNR和HDR做完后,图像的信噪比和动态范围都改善了,但整体亮度可能还是偏暗。亮度增强就是做最后的提亮处理。

最简单的做法是直接乘增益系数。但这样做会把残留噪声也放大。我见过不少方案在亮度增强后噪声又炸了,前两步白做了。

正确的做法是亮度感知的增益控制:

  • 暗部区域:用较大增益,配合空域降噪抑制噪声放大
  • 亮部区域:用较小增益,防止过曝
  • 边缘区域:保持增益一致性,避免出现光晕

高通平台上有专门的亮度增强硬件模块——LCE(Local Contrast Enhancement)。它基于亮度直方图做自适应映射,能同时提升亮度和对比度。我在项目中习惯把LCE放在MFNR和HDR之后,作为最后一道工序。

3.4 信噪比与动态范围的权衡

这是夜景算法最核心的权衡。你想想看:

  • 多帧叠加提升信噪比,但会压缩动态范围(因为平均操作会抹平亮暗差异)
  • HDR合成扩展动态范围,但会引入额外的噪声(短曝光帧噪声大)
  • 亮度增强提升视觉亮度,但会放大噪声

这三者之间是互相制约的。我总结了一个经验公式:

最终图像质量 = SNR提升 × DR扩展 × 亮度增益 / 噪声放大系数

噪声放大系数 = f(增益, 残留噪声水平)

在实际调优时,我建议先固定帧数(比如8帧),然后调整HDR的曝光阶梯,最后微调亮度增强曲线。不要三个参数一起调,否则你根本不知道哪个参数起了作用。

3.5 夜景算法整体流程

下面这张图是我在项目中常用的夜景算法流水线,你可以看到三个模块的衔接关系:

夜景算法整体流水线 Burst RAW采集 全局运动对齐 局部运动匹配 MFNR时域滤波 HDR多曝光融合 LCE亮度增强 注意流程顺序 MFNR → HDR → LCE 顺序颠倒会导致效果退化

流程顺序很关键。我见过有人把HDR放在MFNR前面,结果短曝光帧的噪声被HDR权重放大,后续MFNR都救不回来。正确的顺序是:先做MFNR降噪,再做HDR扩展动态范围,最后做LCE亮度增强。

3.6 实战中的参数调优建议

最后分享几个我在高通平台上调夜景算法的经验:

  • 帧数选择:手持场景用6-8帧,上脚架可以用12-16帧。超过16帧收益递减明显。
  • 曝光策略:基准曝光对准中间调,短曝光比基准低2-3EV,长曝光比基准高2-3EV。
  • 对齐精度:全局对齐误差控制在1像素以内,局部对齐误差控制在0.5像素以内。
  • 权重平滑:HDR权重图一定要做高斯模糊,核大小建议7x7到15x15。
  • 亮度增益:最大增益不要超过4倍(12dB),否则噪声会失控。

小技巧:调试时先关掉LCE,只调MFNR和HDR的参数。等前两步效果满意了,再打开LCE做最后的亮度微调。这样能快速定位问题出在哪个环节。