3. 色彩空间基础:RGB、sRGB、XYZ、Lab 与色度图

做 AWB 调优,说白了就是在不同的色彩空间里来回折腾。你只有理解了颜色是怎么被数学描述的,才能知道白平衡到底在平衡什么。这一章我会把几个最核心的色彩空间讲透,顺便聊聊色度图和色域映射——这些都是 ISP Pipeline 里绕不开的基础。

3.1 RGB 与 sRGB:从传感器到显示器的第一站

RGB 是最直观的色彩模型。红绿蓝三个通道,每个通道 8bit 就是 0-255,组合起来能表达 1600 多万种颜色。但这里有个坑:RGB 是设备相关的。同一个 RGB 值,在你的显示器上和在我的显示器上,看起来可能完全不一样。

sRGB 就是为了解决这个问题而生的。它由微软和惠普在 1996 年联合制定,定义了标准的原色坐标、白点和 Gamma 曲线。现在绝大多数互联网内容都采用 sRGB 作为标准色彩空间。

关键点:sRGB 的 Gamma 约为 2.2,白点色温为 D65(6500K)。这意味着在 AWB 校正后,我们通常要把图像转换到 sRGB 空间才能正确显示。

我在项目中遇到过一个问题:Sensor 输出的 RAW 数据经过 AWB 增益后,直接转 sRGB 显示,结果肤色偏黄。后来发现是 Gamma 预补偿没做对——RAW 数据是线性的,而 sRGB 需要非线性映射。这个坑我踩过一次,之后就再也不敢跳过 Gamma 校正了。

3.2 XYZ 色彩空间:颜色的坐标系

如果说 RGB 是方言,那 XYZ 就是普通话。CIE 1931 XYZ 色彩空间是基于人眼视觉实验建立的,它不依赖任何设备,是颜色的度量。

XYZ 的数学基础是三刺激值。简单来说,人眼有三种视锥细胞,分别对长波(L)、中波(M)、短波(S)敏感。XYZ 就是通过线性变换从 LMS 空间推导出来的。

色彩空间 设备相关性 主要用途 与 AWB 的关系
RGB 相关 显示、采集 原始数据格式
sRGB 相关(标准化) 互联网、显示器 最终输出目标
XYZ 无关 颜色度量、色度计算 色温估计的中间桥梁
Lab 无关 颜色差异评估 白平衡效果评价

从 RGB 到 XYZ 的转换需要 3x3 矩阵。不同 RGB 标准(sRGB、Adobe RGB、DCI-P3)对应不同的转换矩阵。我个人习惯在 ISP 调试时先把 RAW 转到 XYZ 空间做色温估计,再转回 RGB 做增益——这样能避免设备相关性带来的误差。

3.3 CIE 1931 色度图:一张图看懂所有颜色

色度图是把 XYZ 的三维信息投影到二维平面。横轴是 x,纵轴是 y,z = 1 - x - y。马蹄形的边界是单色光谱轨迹,内部是所有可能的颜色。

这张图对 AWB 来说有多重要?我举个例子:你在色度图上标出不同色温的黑体辐射轨迹(Planckian Locus),然后看当前图像的平均色度点落在哪里——离轨迹越远,说明白平衡偏差越大。这就是最经典的灰度世界法 + 色温估计原理。

实战技巧:在 CIE 1931 色度图上,D65 白点的坐标大约是 (0.3127, 0.3290)。AWB 校正的目标就是把图像的白点拉到这条轨迹上。我常用的方法是先计算图像在色度图上的色度分布,再通过增益矩阵把质心点映射到目标色温点。

为什么会用到色度图而不是直接在 RGB 空间做?因为 RGB 空间的色温变化是非线性的,而色度图上的色温变化是平滑连续的。你想想看,在 RGB 空间里调增益,很难直观判断色温偏移了多少度;但在色度图上,距离就是色差,一目了然。

3.4 Lab 色彩空间:人眼感知的均匀性

Lab 空间的设计初衷是让欧几里得距离与人眼感知的颜色差异成正比。L 是亮度,a 是红绿轴,b 是黄蓝轴。这个特性对 AWB 效果评估非常有用。

我记得有一次做 AWB 算法对比,两个版本的增益参数在 RGB 空间里看差异很小,但主观评价一个偏冷一个偏暖。后来用 Lab 空间的 ΔE 指标一算,差异值差了 3 个单位——人眼刚好能感知到。从那以后,我就把 ΔE 作为 AWB 效果的核心量化指标了。

注意:Lab 空间的计算需要先经过 XYZ。从 sRGB 到 Lab 的完整链路是:sRGB → 线性化 → XYZ → Lab。中间任何一步的精度损失都会影响最终结果。我在嵌入式平台上实现时,会使用 LUT 查表法加速 XYZ 到 Lab 的转换,否则计算量太大。

3.5 色域映射:把颜色装进正确的盒子里

色域就是色彩空间能表达的颜色范围。sRGB 的色域较小,DCI-P3 更大,Rec.2020 更大。不同设备有不同的色域,当图像从一个色域转换到另一个色域时,就需要色域映射。

色域映射的核心问题有两个:

  • 裁剪(Clipping):源色域中的颜色在目标色域中不存在,直接截断会导致细节丢失。
  • 压缩(Compression):把整个色域按比例缩小,保留相对关系但牺牲饱和度。

在 AWB 场景下,色域映射最典型的应用是:Sensor 的原始色域通常比 sRGB 大,经过 AWB 增益后,某些颜色可能会超出 sRGB 边界。如果不做色域映射,这些区域就会出现色阶断层或颜色溢出。

我曾经在一个手机项目里遇到过这个问题:夜景模式下 AWB 校正后,天空部分出现了明显的色块。排查后发现是色域映射时用了简单的裁剪算法,导致蓝色通道溢出。后来改用感知压缩映射,问题就解决了。

3.6 本章知识体系

下面这张图总结了各个色彩空间之间的关系,以及它们在 AWB 流程中的位置:

色彩空间与AWB流程关系图 色彩空间与 AWB 流程关系 Sensor RAW 线性 RGB(设备相关) AWB 增益 RGB 域增益校正 XYZ 空间 颜色度量 色度图 Lab 空间 ΔE 评估 sRGB 输出 Gamma + 色域映射 色域映射关键路径 1. Sensor 原生色域 → 线性 RGB(设备相关) 2. AWB 增益校正(RGB 域) 3. XYZ 转换(去设备相关性) 4. 色域映射(裁剪/压缩)→ sRGB 输出

从这张图可以看得很清楚:Sensor RAW 数据经过 AWB 增益后,先转到 XYZ 空间做度量,再通过色域映射输出到 sRGB。同时,Lab 空间作为评估工具,用来量化 AWB 效果的好坏。整个链路环环相扣,任何一个环节出问题,最终的颜色都会偏。

核心总结:色彩空间是 AWB 的数学基础。RGB 是原始数据格式,XYZ 是度量,Lab 是感知评估,色度图是可视化工具,色域映射是输出保障。理解这些概念之间的关系,你就能在 ISP 调试时快速定位问题——是增益算错了,还是色域映射没做好,还是 Gamma 曲线不对。这些经验,都是我在项目里一个一个坑踩出来的。