2. 色彩空间数学原理:线性变换矩阵、伽马校正、逆伽马校正
色彩空间转换的数学基础是理解显示链路中所有颜色处理的前提。本章从线性代数与非线性编码两个维度,拆解色彩空间转换的核心算子:线性变换矩阵用于在色度基向量之间做仿射映射,伽马校正与逆伽马校正则负责在物理光强与数字编码之间建立非线性映射。掌握这三类运算,才能准确设计并调试色彩管理管线。
2.1 线性变换矩阵:色度基向量之间的桥梁
任何色彩空间都由三基色色度坐标与白点定义。从一个色彩空间转换到另一个,本质上是将颜色向量从一个基坐标系变换到另一个基坐标系。该变换在数学上由 3×3 线性变换矩阵 完成。
核心公式:
其中 M 矩阵由源空间与目标空间的三基色 XYZ 值联立求解得到。
[Cdst] = Msrc→dst · [Csrc]其中 M 矩阵由源空间与目标空间的三基色 XYZ 值联立求解得到。
以 BT.709 到 BT.2020 的转换为例,矩阵构造步骤如下:
- 获取基色矩阵:将源空间与目标空间的三基色 XYZ 坐标分别组成 3×3 矩阵 Psrc 和 Pdst。
- 计算白点适配:通过白点 XYZ 值计算各基色通道的缩放系数。
- 合成转换矩阵:M = Pdst · Psrc−1。
| 目标通道 | 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) 向量,检查输出是否落在目标空间色域边界上。
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 |
常见陷阱: 伽马校正必须在线性光域进行。如果对已经过伽马编码的视频数据再次施加伽马校正,会导致颜色失真与对比度异常。调试时务必确认当前数据处于线性域还是非线性域。
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 条目数 | 输出精度(定点位宽) | 暗部误差(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 |
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 的流水线结构,以降低每像素计算开销。