4. HDR 基础概念:动态范围、过曝与欠曝、人眼视觉特性

各位同学,今天我们聊聊 HDR 的基础。说白了,HDR 要解决的核心问题就一个:让相机看到的东西,更接近人眼看到的样子。

我刚开始做 ISP 的时候,总觉得把 sensor 的位数做高就行了。后来发现,根本不是这么回事。你想想看,真实世界的亮度跨度有多大?从星光下的 0.0001 cd/m² 到正午太阳的 10⁸ cd/m²,差了十几个数量级。而我们的 sensor,哪怕是最好的,也就 12-14 bit 的动态范围。这中间的鸿沟,就是 HDR 要填的。

核心认知: HDR 不是一种“特效”,而是一种“还原”。它试图把被 sensor 压缩掉的真实亮度信息,通过多帧融合或特殊曝光策略,重新找回来。

4.1 动态范围:到底在说啥?

动态范围,英文叫 Dynamic Range,缩写 DR。它的定义很简单:系统能同时记录的最大信号与最小信号之比。在图像领域,就是最亮区域和最暗区域的亮度比值。

通常我们用 dB 或 f-stop(档)来表示。换算关系很简单:

  • dB 表示: DR(dB) = 20 × log₁₀(最大亮度 / 最小亮度)
  • f-stop 表示: DR(stop) = log₂(最大亮度 / 最小亮度)

举个例子。一个 12-bit 的 sensor,理论上能记录 0-4095 的灰度值。它的理想动态范围是:

DR(stop) = log₂(4095 / 1) ≈ 12 stops
DR(dB)   = 20 × log₁₀(4095) ≈ 72 dB

但注意,这是理想值。实际 sensor 有噪声,暗部信号会被噪声淹没。我在项目中遇到过,标称 72dB 的 sensor,实际可用动态范围往往只有 60-65dB。嗯,这里要注意,信噪比(SNR)会吃掉你的动态范围。

场景 典型亮度范围 (cd/m²) 所需动态范围 (stop)
阴天室内 10 ~ 500 6-8
晴天室外 100 ~ 100,000 10-12
逆光人像 1 ~ 50,000 14-16
夜景霓虹灯 0.1 ~ 10,000 16-18

你看,逆光场景需要 14-16 stops,而普通 sensor 只有 10-12 stops。这就是为什么逆光拍照,人脸总是黑的——sensor 的 DR 不够用。

4.2 过曝与欠曝:两个极端

当场景的动态范围超过 sensor 的 DR 时,就会发生两件事:

  • 过曝(Overexposure): 亮部像素达到饱和值(比如 4095),信息全部丢失。在图像上表现为一片死白,没有任何纹理。
  • 欠曝(Underexposure): 暗部像素被噪声淹没,信号比噪声还低。在图像上表现为一片死黑,细节全无。

我个人的习惯是,宁可欠曝,不要过曝。为什么?因为过曝的信息是彻底丢失的,你后期拉不回来。而欠曝的区域,只要噪声控制得好,还能通过增益或算法提亮。

避坑指南: 我曾经在一个安防项目中,为了追求暗部细节,把曝光时间拉得很长。结果亮部全过曝了,车牌号都看不清。后来改成短曝光为主帧,长曝光为辅帧的 HDR 策略,才解决问题。记住:过曝是硬伤,欠曝是软伤。

这里有个概念要区分:曝光不足 vs. 动态范围不足。曝光不足是整体偏暗,可以通过增加曝光时间或增益来改善。动态范围不足是同时存在过亮和过暗的区域,你无法通过单一曝光参数来兼顾两者。这就是 HDR 要解决的场景。

4.3 人眼视觉特性:HDR 的终极参考

为什么我们要做 HDR?因为人眼本身就是一台超级 HDR 相机。我简单列几个关键特性:

  1. 瞬时动态范围: 人眼在固定瞳孔和适应状态下,能同时分辨约 10-14 stops 的亮度范围。这已经超过大多数 sensor 了。
  2. 适应动态范围: 人眼通过瞳孔调节和视网膜感光细胞的化学适应,能覆盖约 20-24 stops 的总范围。从星光到正午阳光,人眼都能适应。
  3. 局部自适应: 人眼对不同区域的亮度敏感度不同。在暗区,感光细胞会提高增益;在亮区,会降低增益。这就是局部色调映射(Local Tone Mapping)的生物原型。
  4. 对比度敏感度: 人眼对相对亮度变化敏感,而不是亮度。韦伯定律说:ΔL / L ≈ 常数。也就是说,在暗区,人眼能分辨很小的亮度差;在亮区,需要更大的亮度差才能感知。

你想想看,这给我们的 HDR 算法什么启示?

  • 不需要追求的亮度值,而是保持相对对比度。
  • 暗部需要更精细的量化(更多 bit),亮部可以粗一些。
  • 局部处理比全局处理更符合人眼感知。
注意: 人眼对肤色和人脸的敏感度极高。在 HDR 融合和色调映射时,一定要优先保证人脸区域的细节和自然度。否则,哪怕背景再漂亮,用户也会觉得“这照片怪怪的”。我在手机 ISP 项目中吃过这个亏,后来专门加了一个人脸 ROI 保护模块。

4.4 知识结构图:HDR 基础概念

下面这张图,把动态范围、过曝/欠曝、人眼视觉特性之间的关系串起来了。建议你保存下来,后面讲多帧融合和色调映射时,会反复用到这些概念。

HDR 基础概念知识结构图 HDR 基础概念知识结构 HDR 核心目标 动态范围 (DR) 过曝 vs 欠曝 人眼视觉特性 dB / stop SNR 限制 信息丢失 噪声淹没 局部自适应 韦伯定律 核心结论 HDR = 扩展 sensor DR + 模拟人眼视觉特性

4.5 小结:HDR 到底在做什么?

讲到这里,你应该明白了。HDR 不是凭空创造细节,而是在 sensor 的物理限制和人眼的感知需求之间,搭一座桥。

  • 动态范围是客观存在的物理量,它决定了 sensor 能“看到”多少亮度信息。
  • 过曝与欠曝是动态范围不足时的两种表现,过曝更致命。
  • 人眼视觉特性是 HDR 算法的终极参考,它告诉我们:什么该保留,什么可以压缩。

我个人觉得,理解这三者的关系,比背公式更重要。公式是工具,而这三者的关系是设计思想。后面讲多帧融合、色调映射、局部对比度增强时,你会发现,所有算法都在围绕这三个概念打转。

一个建议: 下次你拍照时,可以刻意观察一下逆光或夜景场景。试着判断:哪些区域过曝了?哪些区域欠曝了?人眼是怎么适应这个场景的?这种“肉眼 HDR 分析”做多了,你设计算法时就会有直觉。