4、动态范围:单次曝光与高动态范围(HDR)需求

动态范围这东西,说白了就是传感器能同时看清亮部和暗部的能力。我经常跟团队里新人讲:你拿手机拍夕阳,天空没细节、地面死黑一片,这就是动态范围不够。

那到底什么是动态范围?用公式说话:

DR = 20 * log10(满阱容量 / 读出噪声)

单位是 dB。满阱容量越大、读出噪声越小,动态范围就越宽。嗯,这里要注意,这个公式是理想情况,实际还要考虑暗电流、PRNU 这些因素。

4.1 单次曝光的局限

单帧图像能记录的亮度范围,受限于传感器的物理特性。我做过一个项目,用 12-bit ADC 的传感器去拍室内外过渡场景,结果亮区饱和、暗区被噪声淹没,后期怎么拉都救不回来。

为什么会这样?因为单次曝光只能选择一个曝光时间。你选短曝光,暗部信噪比不够;选长曝光,亮部直接饱和。这就是所谓的「曝光困境」。

单次曝光典型局限:
  • 亮区饱和:超过满阱容量的光子无法区分
  • 暗区噪声:信号被读出噪声、暗电流噪声淹没
  • 量化精度:ADC 位数决定了可区分的灰度级数

我记得有一次调试安防摄像头,客户要求同时看清窗外的车牌和室内的暗角。单帧图像试了十几种曝光组合,没一个能同时满足。最后只能上 HDR 方案。

4.2 HDR 的核心思路

HDR 的思路其实很简单:既然一次拍不全,那就多拍几次,然后把信息拼起来。你想想看,人眼也是通过瞳孔调节和视网膜适应来实现「实时 HDR」的。

传感器端的 HDR 实现方式,我归纳为三大类:

HDR 方案 原理 典型场景 我踩过的坑
多帧曝光融合 不同曝光时间拍多帧,合成一帧 手机拍照、安防监控 运动物体鬼影严重
空间变化曝光 像素阵列分区域不同曝光 车载摄像头、工业检测 拼接处亮度跳变
对数响应传感器 像素响应曲线对数化 高动态工业视觉 低光下信噪比差

我个人习惯把多帧融合作为首选方案,因为它不改变传感器硬件,纯算法就能实现。但代价也很明显——需要处理运动对齐和鬼影抑制。

4.3 多帧 HDR 的典型流程

多帧 HDR 的 pipeline,我画了一张流程图,你看一眼就明白了:

多帧 HDR 融合流程 多帧输入(短/中/长曝光) 运动对齐 & 鬼影检测 自适应权重计算 多帧加权融合 HDR 输出图像 关键难点 • 运动物体鬼影 • 权重平滑过渡 • 实时性要求

流程看着简单,但每个环节都有坑。我曾经在一个项目中,运动对齐用了光流法,结果处理 1080p 图像一帧要 200ms,根本跑不动。后来换成基于块匹配的快速对齐,才压到 30ms 以内。

4.4 权重计算策略

权重怎么给?这是 HDR 融合的核心。我常用的策略是:

  • 短曝光帧:亮区权重高,暗区权重低(因为暗区信噪比差)
  • 长曝光帧:暗区权重高,亮区权重低(因为亮区可能饱和)
  • 中曝光帧:中间亮度区域权重最高,作为过渡桥梁
我的经验:权重函数不要用硬阈值切换,否则融合后会出现明显的亮度跳变。用高斯型或 S 型曲线做平滑过渡,效果会自然很多。

具体到代码实现,权重计算大概长这样:

// 伪代码:基于亮度的权重计算
float weight_short(float pixel) {
    // 短曝光帧:亮区权重高
    return exp(-pow(pixel - 0.9, 2) / (2 * 0.1 * 0.1));
}

float weight_long(float pixel) {
    // 长曝光帧:暗区权重高
    return exp(-pow(pixel - 0.1, 2) / (2 * 0.1 * 0.1));
}

float weight_medium(float pixel) {
    // 中曝光帧:中间区域权重高
    return exp(-pow(pixel - 0.5, 2) / (2 * 0.15 * 0.15));
}

嗯,这里要注意,权重计算完后一定要归一化,否则融合后的亮度会整体偏移。我见过有人忘了这步,结果图像忽明忽暗,排查了半天才发现是权重和不为 1。

4.5 鬼影问题与解决方案

多帧 HDR 最大的敌人是什么?鬼影。运动物体在不同帧里的位置不一样,直接融合就会出现重影。

我曾经处理过一个监控场景,有人从画面中走过,HDR 融合后那个人变成了半透明的「幽灵」。客户看了直接说不行。

解决鬼影,我总结了几种方法:

方法 原理 优点 缺点
运动掩膜法 检测运动区域,只融合静止区域 实现简单 运动区域丢失 HDR 效果
局部权重调整 运动区域降低长/短帧权重 过渡自然 参数调优麻烦
光流补偿 估计运动矢量,对齐后再融合 效果最好 计算量大
深度学习去鬼影 用 CNN 网络直接预测干净 HDR 效果上限高 需要大量训练数据
避坑指南:运动掩膜法虽然简单,但掩膜边缘处理不好会出现「硬边」效应。我建议对掩膜做高斯模糊,让过渡区域平滑一些。

4.6 动态范围的实际指标

最后聊一下指标。很多传感器标称动态范围 120dB,但实际能用的可能只有 80dB。为什么?因为标称值通常是在理想条件下测的,实际要考虑:

  • 暗电流噪声:长曝光时暗电流会吃掉动态范围
  • 温度影响:温度每升高 10°C,暗电流翻倍,动态范围下降约 6dB
  • ADC 量化噪声:12-bit ADC 理论最大 72dB,实际往往只有 60-65dB

我个人习惯在项目初期就做一次「实际动态范围摸底测试」——用灰阶卡在不同曝光时间下拍摄,然后看实际能分辨的灰阶级数。这个数据比规格书上的数字靠谱得多。

实际项目中的动态范围需求参考:
  • 室内监控:60-80dB
  • 车载前视:100-120dB(要同时看清隧道内外)
  • 工业缺陷检测:80-100dB
  • 手机拍照:80-100dB(多帧融合后可达 120dB+)