2. 色彩空间数学原理:线性变换矩阵、伽马校正、逆伽马校正

色彩空间转换的数学基础是理解显示链路中所有颜色处理的前提。本章从线性代数与非线性编码两个维度,拆解色彩空间转换的核心算子:线性变换矩阵用于在色度基向量之间做仿射映射,伽马校正与逆伽马校正则负责在物理光强与数字编码之间建立非线性映射。掌握这三类运算,才能准确设计并调试色彩管理管线。

2.1 线性变换矩阵:色度基向量之间的桥梁

任何色彩空间都由三基色色度坐标与白点定义。从一个色彩空间转换到另一个,本质上是将颜色向量从一个基坐标系变换到另一个基坐标系。该变换在数学上由 3×3 线性变换矩阵 完成。

核心公式:
[Cdst] = Msrc→dst · [Csrc]
其中 M 矩阵由源空间与目标空间的三基色 XYZ 值联立求解得到。

以 BT.709 到 BT.2020 的转换为例,矩阵构造步骤如下:

  1. 获取基色矩阵:将源空间与目标空间的三基色 XYZ 坐标分别组成 3×3 矩阵 Psrc 和 Pdst。
  2. 计算白点适配:通过白点 XYZ 值计算各基色通道的缩放系数。
  3. 合成转换矩阵:M = Pdst · Psrc−1。
常见色彩空间转换矩阵示例(BT.709 → BT.2020)
目标通道 R709 系数 G709 系数 B709 系数
R2020 0.6274 0.3293 0.0433
G2020 0.0691 0.9195 0.0114
B2020 0.0164 0.0880 0.8956
调试要点: 在嵌入式固件中,线性变换矩阵通常以 Q16 或 Q24 定点数存储。验证矩阵正确性的最快方法是输入纯红 (1,0,0) 向量,检查输出是否落在目标空间色域边界上。
线性变换矩阵映射流程 线性变换矩阵:色彩空间基向量映射 源色彩空间 BT.709 (R,G,B) 3×3 变换矩阵 M709→2020 目标色彩空间 BT.2020 (R,G,B) 矩阵运算细节 1. 源 RGB 向量左乘 M 矩阵,得到目标线性 RGB 2. 矩阵元素由两空间基色 XYZ 与白点联立求解 3. 定点实现时需注意精度截断与饱和处理

2.2 伽马校正:从物理光强到感知编码

人眼对亮度的感知近似对数关系,而非线性。伽马校正利用幂律曲线将线性光强映射到感知均匀的编码空间,从而在有限位深下最大化视觉效率。标准伽马曲线定义为:

V_out = V_in ^ (1 / γ)          // 编码端(伽马校正)
其中 γ 通常取 2.2(CRT 显示特性近似值)

在 BT.1886(SDR 显示标准)中,伽马曲线被更精确地定义为:

L = a · (max(V + b, 0)) ^ γ
其中 a = (L_white - L_black) / (1 + b)^γ
      b = (L_black / L_white) ^ (1/γ)
      γ = 2.4
不同伽马值对编码效率的影响
伽马值 暗部量化步长 亮部量化步长 典型应用
1.0(线性) 均匀 均匀 HDR 场景线性光
2.2 精细 粗糙 sRGB / BT.709 SDR
2.4 更精细 更粗糙 BT.1886 显示端
2.6 极精细 极粗糙 影院 DCI-P3
常见陷阱: 伽马校正必须在线性光域进行。如果对已经过伽马编码的视频数据再次施加伽马校正,会导致颜色失真与对比度异常。调试时务必确认当前数据处于线性域还是非线性域。
伽马校正曲线对比 伽马校正曲线:线性 vs 伽马 2.2 vs 伽马 2.4 输入编码值 (归一化) 输出光强 (归一化) γ=1.0 (线性) γ=2.2 γ=2.4 伽马值越大,暗部编码越精细,亮部编码越粗糙

2.3 逆伽马校正:从编码空间回到线性光

逆伽马校正是伽马校正的逆运算,用于将经过伽马编码的视频数据还原为线性光强,以便进行色彩空间转换、HDR 合成、色调映射等后续处理。其数学形式为:

V_linear = V_encoded ^ γ          // 解码端(逆伽马校正)
注意:对于 sRGB 标准,逆伽马校正使用分段函数:
  V_linear = V_encoded / 12.92                     (V_encoded ≤ 0.04045)
  V_linear = ((V_encoded + 0.055) / 1.055) ^ 2.4  (V_encoded > 0.04045)
调试链路中的位置:
输入视频 → 逆伽马校正 → 线性变换矩阵 → 色彩空间转换 → 伽马校正 → 输出显示
逆伽马校正必须位于线性矩阵之前,伽马校正必须位于线性矩阵之后。

在嵌入式实现中,逆伽马校正通常使用 查找表(LUT) 加速。对于 10-bit 输入,LUT 大小为 1024 个条目,每个条目存储定点线性值。LUT 的精度直接影响暗部细节还原质量。

逆伽马校正 LUT 设计参数对比
输入位深 LUT 条目数 输出精度(定点位宽) 暗部误差(10-bit 输入)
8-bit 256 Q12 (12-bit 小数) ±1 LSB
10-bit 1024 Q14 (14-bit 小数) ±0.5 LSB
12-bit 4096 Q16 (16-bit 小数) ±0.25 LSB
逆伽马校正链路位置 逆伽马校正:显示链路中的关键解码步骤 编码视频输入 逆伽马校正 线性变换矩阵 后续处理 关键约束 • 逆伽马校正必须在任何线性运算(矩阵、滤波)之前执行 • LUT 精度直接影响暗部噪点与色带伪影 • 不同色彩空间(sRGB/BT.709/BT.2020)使用不同的逆伽马曲线

2.4 三者的协同工作流

在完整的色彩管理链路中,线性变换矩阵、伽马校正与逆伽马校正必须按严格顺序协同工作。任何顺序错误都会导致颜色偏移或对比度异常。

调试口诀: “先解码,后变换,再编码”。逆伽马校正(解码)→ 线性矩阵(变换)→ 伽马校正(编码)。

以下是一个完整的 8-bit sRGB 到 BT.2020 转换的数学示例:

// 步骤 1:逆伽马校正(sRGB 解码)
R_lin = sRGB_to_linear(R_8bit / 255.0)
G_lin = sRGB_to_linear(G_8bit / 255.0)
B_lin = sRGB_to_linear(B_8bit / 255.0)

// 步骤 2:线性变换矩阵(sRGB → BT.2020)
R_2020 = 0.6274 * R_lin + 0.3293 * G_lin + 0.0433 * B_lin
G_2020 = 0.0691 * R_lin + 0.9195 * G_lin + 0.0114 * B_lin
B_2020 = 0.0164 * R_lin + 0.0880 * G_lin + 0.8956 * B_lin

// 步骤 3:伽马校正(BT.2020 编码)
R_out = linear_to_BT2020_gamma(R_2020)
G_out = linear_to_BT2020_gamma(G_2020)
B_out = linear_to_BT2020_gamma(B_2020)

在嵌入式系统中,上述三步通常合并为一个 3D LUT 或 级联 1D LUT + 3×3 矩阵 + 1D LUT 的流水线结构,以降低每像素计算开销。

色彩转换流水线 色彩转换流水线:逆伽马 → 矩阵 → 伽马 1D LUT 逆伽马校正 3×3 矩阵 色彩空间变换 1D LUT 伽马校正 流水线优势 • 每像素仅需 3 次 LUT 查表 + 9 次乘加运算 • 支持流水线并行,适合 FPGA/GPU 硬件实现