2、HDR成像原理:多帧HDR合成、单帧HDR(DOL/DCG)、HDR与SDR的映射关系、HDR元数据

各位同学,欢迎来到第二章。

上一章我们聊了RAW是什么,以及噪声从哪来。这一章,咱们正式进入HDR的世界。

HDR,高动态范围。说白了,就是让相机既能看清亮处的云彩纹理,又能同时保留暗部台阶的细节。这不是魔法,是工程。

我个人习惯把HDR成像拆成两条技术路线来讲:多帧合成和单帧原生。这两条路,最终都要面对同一个问题——怎么把拍到的宽动态信息,塞进我们日常看到的SDR屏幕里。


2.1 多帧HDR合成:用时间换动态

这是最经典的方法。手机相机里所谓的“HDR模式”,多半就是它。

原理很简单:

  • 按不同曝光时间,连拍几张RAW。
  • 一张欠曝(保留高光),一张正常,一张过曝(提亮暗部)。
  • 然后通过算法,把三张里最好的部分拼到一起。

我在项目中遇到过一个问题:拍摄城市夜景时,霓虹灯牌和路面阴影的动态范围超过了12档。单帧RAW根本拉不回来。后来用了三帧合成,才把灯牌里的字和路面的纹理同时保留住。

核心流程:
  1. 对齐(Registration):手持拍摄必有位移,先做特征点匹配或光流对齐。
  2. 去鬼影(De-ghosting):画面里有行人、车辆?不处理就会出“半透明幽灵”。
  3. 融合(Fusion):按权重图把各帧的亮部、暗部像素加权合并。
  4. Tone Mapping:把合成后的高动态数据映射到8bit或10bit输出。
避坑指南: 我曾经在融合阶段直接用线性平均,结果运动区域糊成一团。后来改用“拉普拉斯金字塔融合”,边缘清晰度明显提升。你想想看,多帧合成的核心不是“堆在一起”,而是“各取所长”。

2.2 单帧HDR:DOL与DCG

多帧合成有个硬伤——运动场景。你拍三帧,中间隔了几十毫秒,画面里的车已经跑出去老远了。去鬼影算法再强,也扛不住剧烈运动。

所以,工业界和高端手机开始转向单帧HDR。一次曝光,同时拿到长短曝光信息。

2.2.1 DOL(Digital Overlap)

DOL是索尼推的一种技术。它在一个曝光周期内,连续读出两帧:一帧短曝光,一帧长曝光。

  • 短曝光:读出速度快,保留高光细节。
  • 长曝光:积累更多光子,提亮暗部。
  • 两帧在像素级做融合,输出一帧HDR RAW。

嗯,这里要注意:DOL本质上还是“多帧”,只不过两帧之间的时间差极短(微秒级),运动伪影几乎不可见。

2.2.2 DCG(Dual Conversion Gain)

DCG是另一种思路。它不改变曝光时间,而是改变像素的转换增益。

  • 高转换增益(HCG):对弱信号敏感,适合暗部。
  • 低转换增益(LCG):饱和容量大,适合亮部。
  • 同一个像素,在单次曝光内,同时读出HCG和LCG两路信号。
特性 DOL DCG
实现方式 时间域:两次读出 电压域:双增益路径
运动伪影 极低(微秒级间隔) 无(单次读出)
动态范围提升 约2~3档 约1~2档
噪声表现 HCG段噪声低 LCG段读出噪声略高
典型应用 手机主摄、安防 车载、工业相机
注意: DCG虽然能单帧出HDR,但LCG路径的读出噪声通常比HCG高。如果你在暗光场景下强行用DCG,暗部反而可能比普通模式更脏。我建议在光照充足或中等光照下启用DCG,暗光场景还是切回HCG单增益模式更稳妥。

2.3 HDR与SDR的映射关系

你拍到了14档动态范围的RAW,但你的显示器只有8bit(约6~7档)。怎么办?

这就引出了Tone Mapping(色调映射)。说白了,就是把一个宽动态范围的图像,压缩到一个窄动态范围的显示设备上,同时尽量保留视觉上的对比度和细节。

我常用的映射策略分两类:

  • 全局映射:整张图用同一个映射曲线。简单,但容易丢失局部对比度。
  • 局部映射:根据像素周围区域的亮度,动态调整映射曲线。效果好,但计算量大,容易产生光晕伪影。
一个经典的映射公式(简化版):
// Reinhard 全局映射
L_display = L_world / (1 + L_world)

// 其中 L_world 是归一化后的场景亮度
// L_display 是映射后的显示亮度

这个公式简单,但效果偏“平”。实际工程中,我更喜欢用 Filmic Curve 或 ACES 的映射曲线,它们对高光的滚降更自然。

为什么会这样?因为人眼对亮度的感知不是线性的,而是接近对数。所以映射曲线通常要模拟人眼的“S形”响应:暗部提亮,亮部压缩,中间调保持线性。


2.4 HDR元数据

最后,聊聊元数据。你拍了一张HDR照片,怎么让播放器知道它是HDR?怎么让显示器知道该用多大亮度来显示?

答案就是元数据。

常见的HDR元数据标准:

  • Static Metadata(静态元数据):如SMPTE ST 2086,包含最大亮度(MaxCLL)、最大帧平均亮度(MaxFALL)、色域主坐标。整段视频只用一组参数。
  • Dynamic Metadata(动态元数据):如Dolby Vision的RPU、HDR10+。每帧或每个场景可以单独指定亮度映射参数,精度更高。
元数据项 含义 典型值
MaxCLL 内容中单个像素的最大亮度 1000 cd/m²
MaxFALL 内容中单帧的平均亮度上限 400 cd/m²
Mastering Display Primaries 母版监视器的色域坐标 DCI-P3 或 BT.2020
Luminance Mapping (动态) 每帧的亮度映射曲线参数 Dolby Vision RPU
实战经验: 我在做HDR视频编码时,发现如果MaxCLL填得过高(比如4000 cd/m²),而实际内容最高只有1000 cd/m²,播放器会做过度拉伸,导致高光断层。我建议:MaxCLL一定要基于实际内容分析,不要拍脑袋填最大值。

本章知识结构图

下面这张图,把HDR成像的核心路径串起来了。你可以看到多帧和单帧两条路线,最终都汇聚到Tone Mapping和元数据输出。

HDR成像原理知识结构图 HDR成像原理:从传感器到显示 HDR成像 多帧HDR合成 单帧HDR 对齐 → 去鬼影 → 融合 DOL / DCG Tone Mapping 全局映射 (Reinhard/ACES) 局部映射 (光晕风险) HDR元数据 MaxCLL / MaxFALL / 动态元数据 (Dolby Vision, HDR10+)

好了,这一章的内容就是这些。多帧合成和单帧DCG/DOL各有各的适用场景,没有的好坏。Tone Mapping是HDR落地的关键一步,元数据则是HDR生态的“通用语言”。