色彩空间基础:RGB、XYZ、Lab、YCbCr
做自动白平衡调试,说白了就是在跟颜色打交道。而颜色这东西,不同设备、不同标准下看到的完全不一样。我刚开始入行时,就吃过这个亏——明明在显示器上看着很舒服的肤色,打到电视上就偏绿了。后来才明白,是色彩空间没搞对。
今天咱们就把几个核心色彩空间捋一遍。你不用死记硬背公式,关键是理解它们各自在干什么,以及为什么白平衡调试离不开它们。
1. RGB色彩空间——最直观,也最不直观
RGB是硬件最爱的格式。传感器拍出来的是RGB,屏幕显示的是RGB,ISP流水线里大部分处理也在RGB域里做。但说实话,RGB跟人眼感知颜色的方式差得挺远。
举个例子:你把R通道加10,G通道加10,B通道加10,人眼看到的是亮度变了,还是色度变了?答案是两者都变了。RGB的三个分量高度耦合,你动一个,另外两个的感知效果也跟着变。
我在项目中遇到过一件事:调试一个手机摄像头,发现室内白平衡总是偏暖。我试着在RGB域里直接调增益,结果肤色是拉回来了,但绿色植物变得惨不忍睹。这就是RGB的局限性——它不适合做色度相关的调整。
核心要点:RGB适合采集和显示,不适合做颜色分析和校正。白平衡的增益计算可以在RGB域做,但效果评估最好换到其他空间。
2. XYZ色彩空间——颜色的“绝对坐标系”
XYZ是CIE在1931年搞出来的标准。它基于人眼对颜色的平均响应,相当于给颜色定了个“绝对坐标”。不管你的设备是啥,只要知道XYZ值,颜色就是确定的。
从RGB转到XYZ,需要一个3x3的矩阵。不同标准(sRGB、Adobe RGB、DCI-P3)的转换矩阵不一样。我建议你直接记住sRGB的转换矩阵,因为90%的消费级设备都基于它。
// sRGB to XYZ 转换矩阵(D65白点)
[ X ] [ 0.4124564 0.3575761 0.1804375 ] [ R ]
[ Y ] = [ 0.2126729 0.7151522 0.0721750 ] [ G ]
[ Z ] [ 0.0193339 0.1191920 0.9503041 ] [ B ]
注意看第二行——Y分量其实就是亮度。这个特性后面会用到。
XYZ最大的价值在于:它是不同色彩空间之间的“中转站”。你想把sRGB转到DCI-P3?先转XYZ,再转目标空间。我调试跨设备颜色一致性时,全靠XYZ做中间桥梁。
3. Lab色彩空间——最接近人眼的感知模型
Lab是我个人最喜欢的色彩空间。它把颜色分成三个维度:L是亮度,a是红绿轴,b是黄蓝轴。最关键的是,Lab空间里欧几里得距离跟人眼感知的颜色差异基本一致。
这意味着什么?你算两个颜色的差值,数值差1,人眼看不出区别;差3,仔细看能发现;差5以上,明显不一样。这个特性对白平衡评估太有用了。
我曾经用Lab空间做过一个自动白平衡的评估工具:把校正前后的图像转到Lab,算a和b通道的均值。如果均值接近0,说明白平衡做得好。这个方法比肉眼判断靠谱多了。
实用技巧:从XYZ转Lab需要经过非线性变换。公式里有个参考白点(Xn, Yn, Zn),这个值直接影响转换结果。记得用D65白点,别用D50,否则你的Lab值会整体偏黄。
4. YCbCr色彩空间——视频领域的王者
YCbCr是视频压缩和传输的标准格式。Y是亮度,Cb和Cr是蓝色差和红色差。为什么视频不用RGB?因为人眼对亮度变化敏感,对色度变化不敏感。YCbCr可以把色度通道压缩到一半甚至四分之一分辨率,人眼根本看不出来。
从RGB转YCbCr也很简单:
Y = 0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.1687 * R - 0.3313 * G + 0.5 * B + 128
Cr = 0.5 * R - 0.4187 * G - 0.0813 * B + 128
注意Cb和Cr加了128的偏移,这是为了把负数映射到0-255范围。你调试ISP时,很多白平衡算法就是在YCbCr域里做的——因为Cb和Cr直接反映了色偏方向。
避坑指南:我曾经在YCbCr域里做白平衡校正,直接调整Cb和Cr的偏移量。结果发现图像边缘出现了色晕。后来才意识到,YCbCr的色度通道是经过子采样处理的,直接修改会破坏色度插值的一致性。正确的做法是在RGB域做增益调整,或者用全分辨率YCbCr。
5. 色域与色温的关系
色域是设备能显示的颜色范围,色温是光源的颜色特性。这两者经常被混淆,我简单说清楚。
色域用CIE 1931色度图上的三角形表示。sRGB覆盖约35%的可见色域,Adobe RGB约50%,DCI-P3约45%。你调试白平衡时,目标色域决定了你能校正到什么程度。举个例子:一个只支持sRGB的显示器,你就算把白平衡调到完美,也显示不出DCI-P3里的某些饱和色。
色温则用开尔文(K)表示。低色温(3000K)偏黄,高色温(7000K)偏蓝。白平衡的本质,就是把不同色温下的白色物体映射到标准白点(通常是D65,6500K)。
| 色温(K) | 典型场景 | 白平衡调整方向 |
|---|---|---|
| 2700-3000 | 白炽灯 | 大幅增加蓝色增益 |
| 4000-4500 | 荧光灯 | 适度增加蓝色增益 |
| 5500-6500 | 日光 | 基本不调 |
| 7000-10000 | 阴天/阴影 | 增加红色增益 |
这里有个关键点:色温变化时,色域也会跟着变。因为色域是基于白点定义的,白点变了,整个色域三角形在色度图上的位置也会偏移。你想想看,如果白平衡没做对,就算你的设备色域再大,显示出来的颜色也是偏的。
总结一下:RGB是硬件语言,XYZ是通用坐标,Lab是感知模型,YCbCr是视频标准。白平衡调试时,我习惯在RGB域做增益计算,在Lab域做效果评估,在YCbCr域做实时处理。每个空间都有自己的优势,别指望一个空间解决所有问题。
嗯,色彩空间这块内容比较多,但它是后面所有白平衡算法的基础。你先把这几个空间的转换关系记熟,后面讲灰度世界、完美反射这些算法时,你会发现它们其实都是在不同空间里做同一件事——找到那个“真正的白色”。