基于增益图的测试
这是一张基于 Gainmap 增益图的测试图像,基础图像(Baseline Image)是纯蓝色,替代图像(Alternate Image)是纯红色。其中基础图像嵌入了 DCI-P3 色彩空间的 ICC 配置文件,替代图像嵌入了 BT.2020 色彩空间的 ICC 配置文件,并按照 ISO 21496-1 标准计算了增益图(Gainmap)和元数据(Metadata)。
如果你的设备和查看器支持 HDR 显示,看到的应该是纯红色的图像,否则则会显示纯蓝色。一个例子是 iPhone 的低电量模式下,系统会禁用 HDR 显示,切换低电量模式开关,就能看到图像颜色的变化。

在计算元数据和编码这张图的过程中,对于 ISO 21496-1 标准中,Alternate HDR Headroom 这一部分有了更清晰的理解。
回顾增益图的计算
具体内容,请参考之前的分享。
增益图建立基础图像(通常是 SDR)和替代图像(通常是 HDR)之间的映射关系,计算增益图需要准备在同一线性空间中的 HDR 和 SDR 图像。
增益图的计算公式如下:
$$ G = \frac{\text{Alternate} + k_{\text{alt}}}{\text{Baseline} + k_{\text{base}}} $$其中,$\textit{k}_{\textit{alt}}$ 和 $\textit{k}_{\textit{base}}$ 是为了避免除零而添加的常数。然后以 2 为底取对数,并归一化到 $[0, 1]$ 范围内,记录归一化前的最大值和最小值 $\textit{gainmap}_{\textit{max}}$ 和 $\textit{gainmap}_{\textit{min}}$,还可以对归一化后的图应用一个伽马($\gamma$)系数以更好地进行量化,记录 $\gamma$。
发现了吗?整个计算和编码过程中,只需要以下参数:
- $\textit{k}_{\textit{alt}}$ 和 $\textit{k}_{\textit{base}}$:避免除零
- $\textit{gainmap}_{\textit{max}}$ 和 $\textit{gainmap}_{\textit{min}}$:记录增益图归一化前的范围
- $\gamma$:增益图的伽马系数
所以,不需要记录 Headroom,也可以正确的编解码 ISO Gainmap 图像。那么这个 Headroom 到底起到什么作用呢?
Alternate HDR Headroom
简而言之,它可以通过直接计算增益图的权重,来简化解码的计算。我们先来看其具体定义:
Ratio of nominal peak luminance to reference diffuse white luminance expressed as a log base 2 value.
即 HDR 峰值亮度与参考漫反射白点亮度的比值,以 2 为底取对数表示。在上面的例子中,如果线性空间里漫反射白点的亮度为 1.0,那么 Headroom 等于:
$$ \text{Headroom} = \log_2(\max(\text{Alternate})) $$这印证了我们之前的观点:Headroom 并不是必须的,它可以由替代图像的最大亮度计算得出。
其作用在于确定解码时,增益图的权重。增益图的权重是一个 0-1 之间的值,用于自适应的调节显示图像,来匹配显示设备的 HDR 能力。
$$ \text{Alternate} = (\text{Baseline} + k_{\text{baseline}}) \cdot 2^{W \cdot G} - k_{\text{alternate}} $$其中,G 是增益图,W 是增益图的权重,权重由显示设备的 HDR 能力与 Headroom 计算得出。
$$ W = \text{clamp}\left( \frac{H_{\text{Target}} - H_{\text{Baseline}}}{H_{\text{Alternate}} - H_{\text{Baseline}}}, 0, 1 \right) $$其中,$H_{\text{Target}}$ 是显示设备的 HDR 能力,$H_{\text{Baseline}}$ 是基础图像的 Headroom,通常等于 0,$H_{\text{Alternate}}$ 是替代图像的 Headroom。
当显示设备有足够的能力显示完整的替代图像时,权重 W 等于 1,解码结果等于完整的替代图像;当显示设备不足以完全显示替代图像时,权重 W 小于 1,解码结果是基础图像和替代图像的混合,达成自适应的显示效果。
如果没有 Headroom,那么需要先假设权重为 1,解码出完整的替代图像,然后再根据显示设备的 HDR 能力与替代图像的最大亮度计算权重 W,最后用权重 W 重新解码一次,才能得到最终的显示图像。
而有了 Headroom,就可以直接根据显示设备的 HDR 能力与 Headroom 计算权重 W,只解码一次,得到最终的显示图像。节省了一次解码的计算开销。
因此,如果写入了错误的 Headroom,会导致解码时权重 W 计算错误,从而影响最终的显示效果。比如说声明一个超大的 Headroom,那么即便替代图像实际上不需要这么高的 HDR 能力,解码时也会降低权重 W,导致显示效果偏向基础图像。比如给上面这个测试图像写入一个约为 4.46 的 Headroom,即需要 21 倍多的 HDR 能力才能完整显示替代图像,那么多数设备都会先计算出一个较低的权重,导致显示出一个混合的颜色,比如紫色。

这个错误的示例还可以通过调节显示设备的 HDR 能力来改变颜色,手动指定设备的 HDR 能力,从 0 一直增加时,可以看到图像颜色从蓝色逐渐变为到红色。
独树一帜,遥遥领先
我最开始是在华为 Mate 80 RS 上测试这张写入了错误 Headroom 的图片的,结果华为手机能够显示出红色。这张图片还在互联网上被传播,有 KOL 表示只有华为手机能显示红色,别的设备则显示为紫色。

修复了错误的 Headroom 数值后,所有 HDR 设备都能够正确显示红色。应该是华为的 HDR 显示管线有所不同,绕过了 Headroom 的影响。
一个标准中的小细节
标准规定,Alternate Headroom 必须不等于 Baseline Headroom。在这个例子中,因为替代图像中的红色亮度也是 1.0,所以 Headroom 等于 0,会等于 Baseline Headroom,如果这样写入的话,就不能正确的显示红色了,所以对 Alternate Headroom 做了一个微小的偏置。