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 流程中的位置:
从这张图可以看得很清楚:Sensor RAW 数据经过 AWB 增益后,先转到 XYZ 空间做度量,再通过色域映射输出到 sRGB。同时,Lab 空间作为评估工具,用来量化 AWB 效果的好坏。整个链路环环相扣,任何一个环节出问题,最终的颜色都会偏。
核心总结:色彩空间是 AWB 的数学基础。RGB 是原始数据格式,XYZ 是度量,Lab 是感知评估,色度图是可视化工具,色域映射是输出保障。理解这些概念之间的关系,你就能在 ISP 调试时快速定位问题——是增益算错了,还是色域映射没做好,还是 Gamma 曲线不对。这些经验,都是我在项目里一个一个坑踩出来的。