Research Note · color-pipeline

从 BT.601 到 BT.2100

从标清、高清、超高清到 HDR,理解色域、YCbCr 矩阵、量化范围、PQ、HLG 与 ISP/编解码工程实践。

Color ScienceYCbCrHDRISP

1. 引言

一幅图像中的“红色”并不是一个天然确定的数值。只有发送端和接收端对原色、白点、亮度编码以及数值范围采用相同约定,屏幕上显示的颜色才可能与创作者看到的颜色一致。

ITU-R(国际电信联盟无线电通信部门)制定的 BT.601、BT.709 和 BT.2020,分别服务于标清、高清和超高清/宽色域电视时代;BT.2100 则在 BT.2020 原色基础上进一步定义 HDR 电视系统。前三者不只是三套简单的 RGB↔YCbCr 公式,BT.2100 也不只是一条 HDR 曲线,它们共同涉及图像格式、原色、矩阵、传递函数和显示关系。

名称说明:Rec.601、BT.601 和 ITU-R BT.601 通常指同一建议书,709、2020 同理。工程文档中的 P2020 并不是一个通行的独立标准名,往往是某个平台对“BT.2020 primaries(原色)”或某个 BT.2020 配置的简称,必须结合芯片寄存器或 API 文档确认。

判断一段视频的颜色,至少要同时回答四个问题:它采用什么原色/色域,使用什么传递函数,RGB 与 YCbCr 之间采用什么矩阵,码值使用全范围还是视频范围。只知道“这是 YUV”远远不够。

2. 理解颜色标准所需的基础知识

2.1 RGB、YUV 与 YCbCr

RGB 用红、绿、蓝三个分量描述颜色,适合显示设备。YCbCr 将信号分成一个亮度相关分量 Y′ 和两个色差分量 Cb、Cr,更适合视频压缩:人眼对亮度细节敏感、对颜色细节较不敏感,因此可以减少色度样本而保持较好的主观清晰度。

日常开发中“YUV”常被用来泛指数字 YCbCr,但严格来说,YUV 原本是模拟电视体系中的概念,数字视频文件和接口中通常传输的是 YCbCr。

2.2 撇号为什么重要

公式中的 R′G′B′ 和 Y′ 带撇号,表示信号已经过非线性编码。摄像机或制作系统会用光电转换函数压缩亮度范围,显示端再进行相应还原。多数常见 YCbCr 矩阵作用于这种非线性分量,而不是直接作用于线性光 RGB。

2.3 色域、原色与白点

三个 RGB 原色在 CIE 色度图上构成一个三角形,三角形内部是该系统可表示的颜色范围。BT.2020 的三角形比 BT.709 大得多,因此它能编码更饱和的颜色。三种标准通常都以 D65 为参考白点,但 BT.601 的原色还与 525 行、625 行制式背景有关,实际工作不能只凭“都是 D65”判断为同一色域。

2.4 需要分开理解的四类元数据

属性回答的问题常见取值
Color primariesRGB 三原色和白点在哪里?BT.709、BT.2020
Transfer characteristics码值与光亮度如何对应?BT.709、sRGB、PQ、HLG
Matrix coefficientsR′G′B′ 如何转换成 Y′CbCr?BT.601、BT.709、BT.2020 NCL
Range有效码值占完整数字范围还是视频范围?Full、Limited

关键结论:分辨率只能帮助猜测标准,不能代替元数据。1080p 通常是 BT.709,但完全可以存在采用 BT.2020 原色的 1080p 内容。

3. BT.601:标清数字电视的颜色标准

BT.601 建立了数字标清电视演播室编码的重要基础,典型场景包括 480i/480p、576i/576p、DVD 和早期数字广播。它规定了以亮度和色差信号表示数字视频的一套方法,常见采样体系与 4:2:2 视频紧密相关。

3.1 亮度权重

Y′ = 0.2990 R′ + 0.5870 G′ + 0.1140 B′

绿色的权重最大,因为人的视觉对中间波段更敏感;蓝色权重最小。这组系数经常被称作“601 矩阵”的核心特征。

3.2 525 行与 625 行背景

历史上的 NTSC/525 行与 PAL/625 行体系并非所有色度定义都完全相同。现代文件的元数据有时把矩阵系数统一标记为 BT.470BG/SMPTE 170M 一类兼容描述。处理旧素材时,应优先读取可靠元数据或查明素材来源,而不是仅看文件扩展名。

3.3 今天仍会在哪里遇到它

监控摄像头、AV视频采集、DVD 转码、传统广播素材和嵌入式图像链路仍可能使用 BT.601。如果把这些信号按 BT.709 解码,画面不会完全损坏,却会产生可察觉的色相与饱和度误差,这类问题尤其容易在肤色和彩条上暴露。

4. BT.709:高清电视的主流标准

BT.709 面向 HDTV,广泛用于 720p、1080i 和 1080p 的 SDR 制作、广播与网络视频。对于普通高清 SDR 工作流,它通常是最常见的选择。

4.1 亮度权重

Y′ = 0.2126 R′ + 0.7152 G′ + 0.0722 B′

与 BT.601 相比,BT.709 提高了绿色权重,降低了红色和蓝色权重。这不是“画面更绿”,而是原色定义变化后,为维持正确亮度关系而采用的矩阵变化。

4.2 BT.709 与 sRGB

二者采用相同的原色色度坐标和 D65 白点,所以色域边界相同;但它们的传递函数定义和典型使用环境不同。sRGB 主要面向计算机图像和桌面显示,BT.709 面向电视制作。把“相同原色”理解为“整个标准完全相同”是不准确的。

4.3 BT.709 与 BT.1886

BT.709 描述了制作侧信号特性,而 BT.1886 常用于 SDR 参考显示器的电光转换。实际系统的观看环境、黑位和显示器校准也会影响最终观感。因此,一个正确标记为 BT.709 的文件仍需要正确配置的显示链路。

5. BT.2020:面向超高清和宽色域

BT.2020,也常写作 Rec.2020,面向 UHDTV,包括 4K、8K、更高位深和宽色域。它最醒目的特征是原色范围显著扩大,但“BT.2020”本身并不自动意味着 HDR。

5.1 更宽的原色范围

BT.2020 使用更接近光谱轨迹的红、绿、蓝原色,能够容纳 BT.709 之外的高饱和颜色。现实中的显示器未必完整覆盖 BT.2020;许多 HDR 显示设备更接近 Display P3 的覆盖能力,但内容仍可能装在 BT.2020 容器中传输。

5.2 亮度权重

Y′ = 0.2627 R′ + 0.6780 G′ + 0.0593 B′

5.3 NCL 与 CL

BT.2020 定义了非恒定亮度(NCL)和恒定亮度(CL)两类 Y′CbCr 表示。常见视频编码工作流多见 BT.2020 NCL。二者不能只靠替换三个矩阵系数互换,配置编解码器或硬件 CSC 时必须识别对应标志。

5.4 从 BT.2020 到 BT.2100

BT.2020 可用于 SDR,也为 HDR 提供宽色域原色基础;完整的 HDR 电视系统由下一章的 BT.2100 描述,包括 PQ、HLG、HDR 参考白和显示关系。

6. BT.2100 与 HDR

BT.2100 面向 HDR 节目制作和交换,在 BT.2020 原色基础上规定 PQ、HLG、参考观看条件以及从场景到显示的信号关系。

6.1 HDR 不等于 BT.2020

BT.2020 主要定义 UHDTV 图像参数和宽色域,HDR 则扩大亮度表达能力,两者是不同维度。一个文件可以是 BT.2020 原色的 SDR,也可以是采用 BT.2020 原色与 PQ/HLG 的 HDR;因此工程上只写“BT.2020”仍不足以判断应按 SDR 还是 HDR 显示。

6.2 PQ 与 HLG

可以把 PQ 和 HLG 理解成两种“记录亮暗的方法”。它们用非线性曲线把宽动态亮度信息有效编码到有限的 10-bit/12-bit 码值中;场景亮度最终映射到多亮,还取决于曝光、OOTF(整体呈现关系)和色调映射,不能把 PQ/HLG 曲线本身等同于完整的 tone mapping。

实际例子:一场白天的足球比赛。画面同时包含草地、球员白色球衣和太阳照在广告牌上的强反光。

使用 PQ 制作:调色师可以把普通白球衣设为约 203 cd/m²,把广告牌反光设为 1 000 cd/m²。PQ 会记录这些目标亮度。1 000 cd/m² 电视可按目标显示;峰值只有 600 cd/m² 的电视则需要色调映射,把 1 000 cd/m² 高光压缩到自身能力以内,同时尽量维持白球衣和高光的层次。

使用 HLG 直播:制作端更关注“球衣比草地亮、反光又比球衣亮多少”,而不要求反光必须显示成固定的 1 000 cd/m²。1 000 cd/m² 和 600 cd/m² 的电视会根据自身峰值亮度调整整体呈现,在各自能力范围内保持相对亮暗关系。这使 HLG 更适合来不及逐镜头调色的体育、新闻和演唱会直播。

因此,PQ 更像在文件中写下“这个高光目标是多亮”,HLG 更像写下“这个高光相对于画面其他部分有多亮”。它们通常配合 BT.2020 原色和 BT.2020 NCL 矩阵使用,但本身不是色域或 Y′CbCr 矩阵。

项目PQHLG
参照方式显示参照,码值对应确定的目标亮度场景参照,码值表达相对场景亮度
曲线设计按人眼亮度感知分配码值,数学范围最高覆盖 10 000 cd/m²暗部采用 Gamma 类曲线,高光采用对数曲线
显示适配目标显示器低于母版峰值时通常需要色调映射显示端根据峰值亮度和观看条件调整系统 Gamma
典型场景HDR10、HDR10+、Dolby Vision、流媒体母版电视广播、体育直播、新闻和现场制作

PQ 的重点是可预测的绝对显示亮度,制作端通常已经确定整体呈现意图,适合精细调色和离线母版。10 000 cd/m² 是曲线编码上限,并不表示节目或显示器必须达到该亮度。HDR10 常携带静态母版元数据,HDR10+、Dolby Vision 等还可使用动态元数据帮助不同显示器进行映射。

HLG 的重点是保留场景中的相对亮度关系,把更多显示适配留给接收端,因此不强依赖母版峰值元数据,适合难以逐镜头调色的直播。它与传统电视曲线具有一定兼容性,但未经正确转换直接按 SDR 显示,亮度和色彩仍可能不准确。

参考白:BT.2100 中 HDR Reference White 的标称亮度为 203 cd/m²(对标称峰值 1 000 cd/m² 的 HLG 显示同样适用)。普通漫反射白通常位于参考白附近,更高亮度应留给灯光、反射等高光。

6.3 Y′CbCr 与 ICtCp

主流编码和分发仍经常使用 BT.2020 NCL Y′CbCr。BT.2100 还定义了 ICtCp:I 表示强度相关分量,Ct/Cp 表示两路颜色分量。它针对 HDR 和宽色域设计,在某些高动态范围处理、色度压缩和颜色差异保持场景中比传统 Y′CbCr 更合适。

ICtCp 不是把 BT.2020 矩阵换成另一组简单的 3×3 系数;其处理涉及 LMS 变换及 PQ/HLG 对应的非线性步骤,应按 BT.2100 的完整流程实现。

6.4 显示端映射

多数显示器不能完整覆盖 BT.2020,也不一定达到母版峰值亮度,因此播放端通常需要色域映射和色调映射。映射目标不是简单裁掉超范围数值,而是在保留亮度层次、色相、饱和度和创作意图之间取得平衡。

标准状态:当前有效版本为 ITU-R BT.2100-3。实施项目仍应以具体交付规范指定的版本和 HDR 格式为准。

6.5 ISP 与显示端分别做什么

环节主要处理
ISP/制作端Sensor RAW → HDR 合成与颜色校正 → 线性 BT.2020 RGB → 曝光/OOTF/色调处理 → PQ 或 HLG 编码 → BT.2020 NCL Y′CbCr
视频编码器压缩已经生成的 Y′CbCr 码值,并写入 BT.2020、PQ/HLG、Range 等颜色元数据;通常不负责自动选择 HDR 呈现方式。
显示端解码 → Y′CbCr 转 BT.2020 RGB → PQ/HLG 显示转换 → 按面板能力执行色调映射和色域映射 → 驱动面板发光

PQ 的目标显示亮度和主要呈现意图通常在 ISP/后期制作端确定,显示端在能力不足时再做适配;HLG 保存更多相对场景关系,其 OOTF 和最终亮度适配更多留在显示端。若摄像机输出 RAW 或厂商 Log,最终 PQ/HLG 转换也可以放到后期而不是 ISP 内完成。

7. BT.601、BT.709 与 BT.2020 图像标准对比

本章只比较三套具有常用 Y′CbCr 矩阵系数的图像标准。BT.2100 建立在 BT.2020 原色之上,重点定义 HDR 传递和显示系统,因此不作为“第四套普通 CSC 矩阵”加入下表。

项目BT.601BT.709BT.2020
典型时代标清电视高清 SDR超高清、宽色域
典型分辨率480/576 系列720/1080 系列2160/4320 系列
Kr0.29900.21260.2627
Kg0.58700.71520.6780
Kb0.11400.07220.0593
参考白点通常 D65D65D65
相对色域较小中等显著更宽
是否天然等于 HDR

“SD 用 601、HD 用 709、UHD 用 2020”是实用经验,但不是严格判定规则。可靠处理顺序应为:读取容器和码流元数据;核对制作或采集设备配置;最后才根据分辨率与年代推测。

8. RGB 与 YCbCr 的数学转换

KrKgKb 为对应标准的亮度权重,并满足 Kr + Kg + Kb = 1。归一化的非线性 R′G′B′ 可先转换为 Y′ 和双极性色差:

Y′ = Kr·R′ + Kg·G′ + Kb·B′
Cb = (B′ − Y′) / [2·(1 − Kb)]  Cr = (R′ − Y′) / [2·(1 − Kr)]

逆变换为:

R′ = Y′ + 2·(1 − Kr)·Cr
B′ = Y′ + 2·(1 − Kb)·Cb
G′ = [Y′ − Kr·R′ − Kb·B′] / Kg

上述公式使用归一化表示。写入 8-bit 或 10-bit 文件时,还需要根据 Full/Limited Range 进行缩放和添加偏置。硬件常把矩阵写成定点系数,必须明确系数小数位、乘加位宽、舍入方式以及输出限幅。

8.1 为什么网上的矩阵数值不完全一样

有的矩阵直接处理归一化数值,有的已把 Limited Range 的缩放和 16/128 偏置合并进去;有的给正向矩阵,有的给逆向矩阵;还有的对系数进行了整数近似。比较两份矩阵前,应先统一输入范围、输出范围、通道顺序和数值精度。

9. Full Range 与 Limited Range

量化范围决定有效图像映射到数字码值中的哪一段。它不会改变 BT.601、BT.709 或 BT.2020 的颜色方向,而是在矩阵计算之后对信号进行缩放和添加偏置。同一套 BT.709 矩阵既可以输出 Limited Range,也可以输出 Full Range。

9.1 两种范围的码值定义

在 8-bit Limited Range 中,标称黑到白的 Y′ 映射为 16~235,Cb/Cr 的标称范围为 16~240,中性色度为 128。Full Range 的 Y′ 通常使用 0~255,色度也使用完整码值空间,中性仍位于 128 附近。

位深Limited Y′Limited Cb/CrFull Y′/Cb/Cr
8-bit16~23516~240,中性 1280~255
10-bit64~94064~960,中性 5120~1023
12-bit256~3760256~3840,中性 20480~4095

因此,在 Limited Range 中,Y=16 才是标称黑色,Y=235 是标称白色;Y 值为 0 并不表示“更正确的黑”。Cb、Cr 是以中心码值表示无色差的双极性信号,所以中性灰的 Cb/Cr 在 8-bit 中约为 128,在 10-bit 中约为 512。

9.2 为什么广播视频要保留两端空间

Limited Range 源于广播电视与模拟视频的历史。早期视频链路还要容纳同步、电平基准和设备误差,数字化时没有把黑色直接放在码值 0,而是为黑位以下和白位以上预留空间。这种约定随后延续到数字演播室、SDI、DVD、蓝光和视频编解码系统中。

预留空间对数字处理也有现实作用。缩放、锐化和重采样滤波可能在高反差边缘产生短暂的过冲或下冲。例如标称范围为 16~235 的信号,滤波后可能产生 12 或 241。两端余量让中间处理能够暂时保存这些结果,而不必立即截断:

  • Footroom:黑位以下的余量,8-bit Y′ 中通常指 0~15。
  • Headroom:白位以上的余量,8-bit Y′ 中通常指 236~255。
注意:16~235 和 16~240 是标称视频范围,不代表范围外码值一定非法。专业处理链路可能保留低于黑位或高于白位的样本,最终显示或交付环节再决定如何限幅。

9.3 为什么计算机图像更常使用 Full Range

计算机图形没有传统广播同步信号的历史约束,直接把 0 定义为最小值、把 255 定义为最大值更自然,也能使用全部 8-bit 码值。因此电脑 RGB、屏幕截图、PNG、JPEG、GPU 渲染和机器视觉数据通常使用 Full Range;广播电视、H.264/H.265 分发、SDI 和 HDR 视频则更常使用 Limited Range。

这只是常见约定而不是强制绑定。H.264、H.265 和 AV1 都能承载 Full Range 或 Limited Range;像素实际范围必须与码流元数据、接口配置一致。

9.4 Full 与 Limited 的数值转换

对于归一化亮度 Y′∈[0,1],8-bit 输出可写成:

Full:Ycode = 255 × Y′
Limited:Ycode = 16 + 219 × Y′

已有 8-bit Full Range 码值与 Limited Range 码值之间可以按下式转换:

Ylimited = 16 + Yfull × 219 / 255
Yfull = (Ylimited − 16) × 255 / 219

色度以 128 为中心,并使用 224 个标称量化间隔:

Climited = 128 + (Cfull − 128) × 224 / 255

实际整数实现还要明确舍入、负数移位和输出限幅。对 10-bit 视频可以直接使用 64、940、960 和 512 等相应码值,避免先降到 8-bit 再放大造成精度损失。

9.5 三种标准的 Full/Limited 矩阵

下面将颜色标准与量化范围合并,列出 ISP 和软件处理中常用的 8-bit Full RGB→8-bit Y′CbCr 浮点矩阵。统一形式为:

[Y′, Cb, Cr]ᵀ = M × [R′, G′, B′]ᵀ + Offset
  • 输入 R′、G′、B′ 均为 Full Range,取值 0~255。
  • Full 输出的 Y′ 为 0~255,Cb/Cr 中性码值为 128。
  • Limited 输出的 Y′ 为 16~235,Cb/Cr 为 16~240,中性码值为 128。
  • 系数保留六位小数,最终实现必须规定舍入和限幅方式。

9.5.1 BT.601

Full Range:

┌ Y′ ┐   ┌  0.299000   0.587000   0.114000 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.168736  -0.331264   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.418688  -0.081312 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.256788   0.504129   0.097906 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.148223  -0.290993   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.367788  -0.071427 ┘ └ B′ ┘   └ 128 ┘

9.5.2 BT.709

Full Range:

┌ Y′ ┐   ┌  0.212600   0.715200   0.072200 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.114572  -0.385428   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.454153  -0.045847 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.182586   0.614231   0.062007 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.100644  -0.338572   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.398942  -0.040274 ┘ └ B′ ┘   └ 128 ┘

9.5.3 BT.2020 NCL

BT.2020 视频工程中通常使用非恒定亮度版本,即 BT.2020 NCL/NC。

Full Range:

┌ Y′ ┐   ┌  0.262700   0.678000   0.059300 ┐ ┌ R′ ┐   ┌   0 ┐
│ Cb │ = │ -0.139630  -0.360370   0.500000 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.500000  -0.459786  -0.040214 ┘ └ B′ ┘   └ 128 ┘

Limited Range:

┌ Y′ ┐   ┌  0.225613   0.582282   0.050928 ┐ ┌ R′ ┐   ┌  16 ┐
│ Cb │ = │ -0.122655  -0.316560   0.439216 │ │ G′ │ + │ 128 │
└ Cr ┘   └  0.439216  -0.403890  -0.035325 ┘ └ B′ ┘   └ 128 ┘

9.5.4 矩阵缩放与高位深

对以上 8-bit Full RGB 输入,Limited 的 Y′ 行等于 Full 矩阵对应行乘以 219/255,Cb/Cr 行乘以 224/255,再分别加入 16 和 128 偏置。这正是上一节范围转换公式在 3×3 CSC 矩阵中的展开。

如果输入是 N-bit Full RGB,令 F=2ᴺ−1S=2ᴺ⁻⁸,则输出 Limited Range 的参数为:

Y′ 系数缩放:    219 × S / F       Y′ 偏置:16 × S
Cb/Cr 系数缩放:224 × S / F       色度偏置:128 × S

例如 10-bit Limited 的 Y′ 为 64~940,Cb/Cr 为 64~960,中性码值为 512。数据手册中的“Limited 矩阵”还可能假设输入 RGB 本身也是 Limited,使用前必须同时确认输入范围、输出范围、位深和偏置位置。

适用边界:这些矩阵用于非线性 R′G′B′→Y′CbCr,不应直接作用于传感器 RAW 或线性光 RGB。BT.2020 CL 也不是简单的 3×3 NCL 矩阵,应按其专门定义实现。

9.6 范围解释错误的画面表现

实际数据错误解释画面结果
Limited按 Full 显示16 被当成非零亮度,黑色发灰;235 未达到最大值,白色偏暗,整体对比度不足。
Full按 Limited 显示0~15 被压成黑,236~255 被压成白,暗部和高光细节剪切,对比度过强。
已经是 Limited再次执行 Full→Limited范围被压缩到约 30~218,画面明显发灰。
已经是 Full重复扩展两端数据溢出或限幅,黑白细节严重丢失。

范围错误主要影响黑位、白位和对比度;601/709/2020 矩阵错误主要影响色相与饱和度。测试时可以先用灰阶和黑白电平图区分范围问题,再用彩条检查颜色矩阵。

9.7 ISP 与视频编码器中的配置

普通 SDR 摄像机链路常见配置如下:

ISP R′G′B′ → BT.709 CSC → Y′CbCr Limited → H.264/H.265 编码

如果 ISP 的 CSC 已经将结果压缩到 Limited Range,编码器预处理模块就不应再次压缩。编码器还需要在 H.264/H.265 VUI 中写入与像素一致的范围标志:Limited 通常对应 video_full_range_flag=0,Full 对应 video_full_range_flag=1

项目类型常见选择说明
普通 H.264/H.265 视频Limited兼容电视和主流视频播放链路。
HDR10、HLG通常 Limited常配合 10-bit BT.2020 NCL。
电脑 RGB、屏幕截图Full使用完整数字范围。
JPEG 图片通常 FullJPEG YCbCr 与广播视频范围约定不同。
机器视觉和算法输入通常 Full最终以算法接口的数据规范为准。
ISP 输出给视频编码器通常 Limited必须同步配置编码器范围元数据。
工程原则:应同时核对 ISP CSC 输出范围、DMA 中的实际码值、编码器输入设置、码流范围标志以及显示端配置。选择 Full 或 Limited 都可以,最危险的是各环节对同一批码值采用了不同解释。

10. 标准使用错误及其画面表现

错误典型表现优先检查
601 按 709 解码,或相反肤色、红色和绿色产生轻微到明显偏差矩阵系数元数据
2020 按 709 解码高饱和颜色明显错误,整体色彩关系异常原色与矩阵是否分别正确
Limited/Full 混用发灰,或黑白剪切、对比过强输入输出量化范围
U/V 顺序颠倒蓝红大幅互换,肤色严重失真NV12/NV21、I420/YV12
把 PQ 当 SDR画面异常灰暗或亮度关系错误传递函数和 HDR 元数据
色度位置错误彩色边缘错位或渗色采样位置与缩放算法

排查时不要只用自然图像。标准彩条、灰阶、纯色块、黑白电平图和高饱和边界图能把不同类别的错误分离出来。先验证灰阶和范围,再验证矩阵与色度通道,最后检查传递函数和显示管理。

11. 工程实践与标准选择

11.1 一条可靠的判断流程

  1. 读取容器与码流中的 primaries、transfer、matrix 和 range 标记。
  2. 核对摄像机、ISP、编码器或素材交付文档,确认元数据是否可信。
  3. 确认像素格式、色度顺序、采样比例、位深和端序。
  4. 在 CSC 前后分别确定数值范围,避免重复扩展或重复压缩。
  5. 用已知测试向量验证黑、白、灰和 RGB/CMY 六个高饱和颜色。
  6. 对整数实现检查误差上限、溢出、舍入和限幅行为。

11.2 FPGA/ASIC 中的 CSC

硬件颜色空间转换通常实现为 3×3 矩阵、三个偏置和输出限幅。设计接口时,应把矩阵标准与量化范围作为显式配置,而不是隐含在“HD 模式”等模糊开关中。验证模型应采用较高精度参考计算,并覆盖最小码值、最大码值、中性色、系数切换和流水线边界。

定点化时需要为乘法结果和累加器预留足够位宽;负色差、偏置合并与算术右移尤其容易出现符号扩展错误。若模块同时支持 RGB→YCbCr 和 YCbCr→RGB,还应分别验证两个方向,不能只用往返转换掩盖互相抵消的误差。

11.3 软件和编解码链路

在 FFmpeg、GPU API、显示服务器或驱动中,应显式传递颜色属性。转码时不仅要转换像素数值,也要更新输出元数据;否则“像素已经转成 709、标签仍写着 2020”的文件会在下一环节再次被错误转换。

裸 YUV 文件尤其容易出错,因为它通常不包含矩阵和 Range 元数据。在传统 FFmpeg/libswscale 转换路径中,颜色信息完全未知时通常回退为 BT.601 + Limited Range。如果实际输入是 BT.601 Full,矩阵虽然相同,量化范围却不匹配:

项目实际 BT.601 Full被错误解释为 BT.601 Limited
Y′0~255把 16~235 当成标称黑白范围
Cb/Cr通常使用完整码值范围,中性约为 128按 16~240、中心 128 扩展
画面结果应保留完整黑白层次0~15 暗部和 236~255 高光被剪切,颜色还可能过饱和

处理已知为 BT.601 Full 的裸 YUV 时,应同时指定矩阵和输入范围:

ffmpeg -f rawvideo -pix_fmt yuv420p -s 1920x1080 \
  -i input.yuv \
  -vf "scale=in_color_matrix=bt601:in_range=pc,format=rgb24" \
  output.png

其中 in_color_matrix=bt601 选择颜色矩阵,in_range=pc 表示输入为 Full Range;若输入是 Limited,应改用 in_range=tvtv/pc 只表示量化范围,并不分别等同于 BT.601/BT.709。输入文件已有可靠颜色元数据时,FFmpeg 可以使用元数据;裸 YUV 或元数据不可信时不应依赖默认值。

11.4 H.273、VUI 与颜色元数据

ITU-T H.273(与 ISO/IEC 23091-2 技术对齐)为视频和静止图像定义与具体编解码器无关的信号类型编号。H.264、H.265、AV1 等码流或容器会引用这些约定,使解码后的码值能够被正确解释。

颜色属性说明常见表示
colour_primariesRGB 原色和参考白点BT.709、BT.2020
transfer_characteristics码值与场景光/显示光之间的关系BT.709、PQ、HLG
matrix_coefficientsR′G′B′ 与 Y′CbCr/其他分量之间的矩阵类型BT.601 类、BT.709、BT.2020 NCL
video_full_range_flag码值使用 Full 还是 Limited Range1 = Full,0 = Limited
chroma_sample_location4:2:0 色度样本相对亮度样本的位置left、center、topleft 等

VUI 或容器元数据通常只是描述像素,并不会自动修改像素值。若 ISP 实际输出 BT.709 Limited,而编码器把它标记为 BT.601 Full,解码仍可能成功,但显示端会使用错误矩阵和范围。

11.5 JPEG/JFIF 与视频 YCbCr

常见 JPEG/JFIF 图像采用由 BT.601 亮度权重派生的 YCbCr,并通常使用 Full Range。它与广播视频常见的“BT.601 Limited”不能直接等同:

JPEG/JFIF 常见:601 类矩阵 + Full Range  标清视频常见:BT.601 矩阵 + Limited Range

因此,同一个 ISP 若同时输出 JPEG 和 H.264,可能需要两套范围配置:JPEG 路径输出 Full Range,视频编码路径输出 Limited Range。JPEG 也可能通过 ICC 配置或其他元数据描述不同颜色解释,实际接口仍应以编码器和文件规范为准。

11.6 上线前检查清单

  • 原色、传递函数、矩阵和范围均有明确取值。
  • 像素格式与 U/V 顺序已经通过纯色测试验证。
  • 输入、内部计算和输出位深定义清楚。
  • Limited/Full 的缩放与偏置只执行一次。
  • 中性灰转换后 Cb/Cr 保持在中心码值附近。
  • 边界输入不会造成累加器溢出或输出回绕。
  • 码流元数据与实际像素变换结果一致。

12. 总结

BT.601 主要属于标清时代;BT.709 是高清 SDR 的主流基础;BT.2020 为超高清和宽色域提供更大的颜色容器;BT.2100 则基于 BT.2020 原色建立 PQ/HLG HDR 电视系统。

BT.601/709/2020 最常被开发者看到的差异是 Y′CbCr 矩阵系数,BT.2100 的核心则是 HDR 传递与显示关系。完整的颜色解释还依赖原色、传递函数、量化范围、位深和元数据;像素格式只告诉你数据怎样排列,不告诉你颜色是什么意思。

工程上最稳妥的原则是:优先相信经过核验的元数据,显式配置每个颜色属性,并用标准测试图和数值向量验证整条链路。

← 返回技术文章