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,我画了一张流程图,你看一眼就明白了:
流程看着简单,但每个环节都有坑。我曾经在一个项目中,运动对齐用了光流法,结果处理 1080p 图像一帧要 200ms,根本跑不动。后来换成基于块匹配的快速对齐,才压到 30ms 以内。
4.4 权重计算策略
权重怎么给?这是 HDR 融合的核心。我常用的策略是:
- 短曝光帧:亮区权重高,暗区权重低(因为暗区信噪比差)
- 长曝光帧:暗区权重高,亮区权重低(因为亮区可能饱和)
- 中曝光帧:中间亮度区域权重最高,作为过渡桥梁
具体到代码实现,权重计算大概长这样:
// 伪代码:基于亮度的权重计算
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+)