1. 引言
一幅图像中的“红色”并不是一个天然确定的数值。只有发送端和接收端对原色、白点、亮度编码以及数值范围采用相同约定,屏幕上显示的颜色才可能与创作者看到的颜色一致。
ITU-R(国际电信联盟无线电通信部门)制定的 BT.601、BT.709 和 BT.2020,分别服务于标清、高清和超高清/宽色域电视时代;BT.2100 则在 BT.2020 原色基础上进一步定义 HDR 电视系统。前三者不只是三套简单的 RGB↔YCbCr 公式,BT.2100 也不只是一条 HDR 曲线,它们共同涉及图像格式、原色、矩阵、传递函数和显示关系。
判断一段视频的颜色,至少要同时回答四个问题:它采用什么原色/色域,使用什么传递函数,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 primaries | RGB 三原色和白点在哪里? | BT.709、BT.2020 |
| Transfer characteristics | 码值与光亮度如何对应? | BT.709、sRGB、PQ、HLG |
| Matrix coefficients | R′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 亮度权重
绿色的权重最大,因为人的视觉对中间波段更敏感;蓝色权重最小。这组系数经常被称作“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 亮度权重
与 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 亮度权重
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 矩阵。
| 项目 | PQ | HLG |
|---|---|---|
| 参照方式 | 显示参照,码值对应确定的目标亮度 | 场景参照,码值表达相对场景亮度 |
| 曲线设计 | 按人眼亮度感知分配码值,数学范围最高覆盖 10 000 cd/m² | 暗部采用 Gamma 类曲线,高光采用对数曲线 |
| 显示适配 | 目标显示器低于母版峰值时通常需要色调映射 | 显示端根据峰值亮度和观看条件调整系统 Gamma |
| 典型场景 | HDR10、HDR10+、Dolby Vision、流媒体母版 | 电视广播、体育直播、新闻和现场制作 |
PQ 的重点是可预测的绝对显示亮度,制作端通常已经确定整体呈现意图,适合精细调色和离线母版。10 000 cd/m² 是曲线编码上限,并不表示节目或显示器必须达到该亮度。HDR10 常携带静态母版元数据,HDR10+、Dolby Vision 等还可使用动态元数据帮助不同显示器进行映射。
HLG 的重点是保留场景中的相对亮度关系,把更多显示适配留给接收端,因此不强依赖母版峰值元数据,适合难以逐镜头调色的直播。它与传统电视曲线具有一定兼容性,但未经正确转换直接按 SDR 显示,亮度和色彩仍可能不准确。
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,也不一定达到母版峰值亮度,因此播放端通常需要色域映射和色调映射。映射目标不是简单裁掉超范围数值,而是在保留亮度层次、色相、饱和度和创作意图之间取得平衡。
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.601 | BT.709 | BT.2020 |
|---|---|---|---|
| 典型时代 | 标清电视 | 高清 SDR | 超高清、宽色域 |
| 典型分辨率 | 480/576 系列 | 720/1080 系列 | 2160/4320 系列 |
| Kr | 0.2990 | 0.2126 | 0.2627 |
| Kg | 0.5870 | 0.7152 | 0.6780 |
| Kb | 0.1140 | 0.0722 | 0.0593 |
| 参考白点 | 通常 D65 | D65 | D65 |
| 相对色域 | 较小 | 中等 | 显著更宽 |
| 是否天然等于 HDR | 否 | 否 | 否 |
“SD 用 601、HD 用 709、UHD 用 2020”是实用经验,但不是严格判定规则。可靠处理顺序应为:读取容器和码流元数据;核对制作或采集设备配置;最后才根据分辨率与年代推测。
8. RGB 与 YCbCr 的数学转换
令 Kr、Kg、Kb 为对应标准的亮度权重,并满足 Kr + Kg + Kb = 1。归一化的非线性 R′G′B′ 可先转换为 Y′ 和双极性色差:
逆变换为:
上述公式使用归一化表示。写入 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/Cr | Full Y′/Cb/Cr |
|---|---|---|---|
| 8-bit | 16~235 | 16~240,中性 128 | 0~255 |
| 10-bit | 64~940 | 64~960,中性 512 | 0~1023 |
| 12-bit | 256~3760 | 256~3840,中性 2048 | 0~4095 |
8-bit Limited:0 16(黑) 235(白) 255
8-bit Full:0(黑) 255(白)
因此,在 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。
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 输出可写成:
已有 8-bit Full Range 码值与 Limited Range 码值之间可以按下式转换:
色度以 128 为中心,并使用 224 个标称量化间隔:
实际整数实现还要明确舍入、负数移位和输出限幅。对 10-bit 视频可以直接使用 64、940、960 和 512 等相应码值,避免先降到 8-bit 再放大造成精度损失。
9.5 三种标准的 Full/Limited 矩阵
下面将颜色标准与量化范围合并,列出 ISP 和软件处理中常用的 8-bit Full RGB→8-bit Y′CbCr 浮点矩阵。统一形式为:
- 输入 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ᴺ−1、S=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,使用前必须同时确认输入范围、输出范围、位深和偏置位置。
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 的 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 图片 | 通常 Full | JPEG YCbCr 与广播视频范围约定不同。 |
| 机器视觉和算法输入 | 通常 Full | 最终以算法接口的数据规范为准。 |
| ISP 输出给视频编码器 | 通常 Limited | 必须同步配置编码器范围元数据。 |
10. 标准使用错误及其画面表现
| 错误 | 典型表现 | 优先检查 |
|---|---|---|
| 601 按 709 解码,或相反 | 肤色、红色和绿色产生轻微到明显偏差 | 矩阵系数元数据 |
| 2020 按 709 解码 | 高饱和颜色明显错误,整体色彩关系异常 | 原色与矩阵是否分别正确 |
| Limited/Full 混用 | 发灰,或黑白剪切、对比过强 | 输入输出量化范围 |
| U/V 顺序颠倒 | 蓝红大幅互换,肤色严重失真 | NV12/NV21、I420/YV12 |
| 把 PQ 当 SDR | 画面异常灰暗或亮度关系错误 | 传递函数和 HDR 元数据 |
| 色度位置错误 | 彩色边缘错位或渗色 | 采样位置与缩放算法 |
排查时不要只用自然图像。标准彩条、灰阶、纯色块、黑白电平图和高饱和边界图能把不同类别的错误分离出来。先验证灰阶和范围,再验证矩阵与色度通道,最后检查传递函数和显示管理。
11. 工程实践与标准选择
11.1 一条可靠的判断流程
- 读取容器与码流中的 primaries、transfer、matrix 和 range 标记。
- 核对摄像机、ISP、编码器或素材交付文档,确认元数据是否可信。
- 确认像素格式、色度顺序、采样比例、位深和端序。
- 在 CSC 前后分别确定数值范围,避免重复扩展或重复压缩。
- 用已知测试向量验证黑、白、灰和 RGB/CMY 六个高饱和颜色。
- 对整数实现检查误差上限、溢出、舍入和限幅行为。
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=tv。tv/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_primaries | RGB 原色和参考白点 | BT.709、BT.2020 |
| transfer_characteristics | 码值与场景光/显示光之间的关系 | BT.709、PQ、HLG |
| matrix_coefficients | R′G′B′ 与 Y′CbCr/其他分量之间的矩阵类型 | BT.601 类、BT.709、BT.2020 NCL |
| video_full_range_flag | 码值使用 Full 还是 Limited Range | 1 = Full,0 = Limited |
| chroma_sample_location | 4: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”不能直接等同:
因此,同一个 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 传递与显示关系。完整的颜色解释还依赖原色、传递函数、量化范围、位深和元数据;像素格式只告诉你数据怎样排列,不告诉你颜色是什么意思。
工程上最稳妥的原则是:优先相信经过核验的元数据,显式配置每个颜色属性,并用标准测试图和数值向量验证整条链路。