颜色空间概述:RGB颜色空间、sRGB与Adobe RGB、线性RGB与Gamma校正

各位同学,咱们今天聊聊颜色空间。说实话,我刚入行那会儿,觉得颜色嘛,不就是RGB三个数字嘛,有啥好研究的?结果第一次做色彩校正,出来的图像偏色偏得我怀疑人生。嗯,从那以后,我再也不敢小看这个基础概念了。

颜色空间,说白了就是一套用数字描述颜色的规则。不同的规则,描述出来的颜色范围、精度都不一样。你想想看,同样一个红色,在显示器上看和打印出来看,能一样吗?这就是颜色空间在背后搞鬼。

RGB颜色空间:最基础的加法混色

RGB颜色空间是最常见的颜色模型。它基于人眼对红、绿、蓝三种颜色的感知,通过不同强度的组合来产生各种颜色。我个人习惯把它想象成三盏不同颜色的手电筒,照在同一面墙上——光叠加得越多,颜色越亮,最终变成白色。这就是加法混色。

在RGB空间中,每个颜色通道通常用8位整数表示,范围0-255。比如纯红色是(255, 0, 0),纯白色是(255, 255, 255)。但这里有个坑——这个0-255的范围,其实对应的是非线性编码值,而不是真实的物理光强。我刚开始做项目时,就直接拿这些值去做颜色计算,结果算出来的颜色完全不对。

⚠️ 避坑指南: 我曾经在做一个手机摄像头ISP调试项目时,直接用sRGB的像素值做白平衡计算,结果色温怎么调都不对。后来才发现,sRGB的数值是经过Gamma校正的,不能直接用于线性运算。这个教训让我多花了整整两周时间。

sRGB与Adobe RGB:两个主流标准

sRGB是惠普和微软在1996年推出的标准,目的是让不同设备显示的颜色尽量一致。它覆盖了大约35%的CIE可见色域,虽然不算大,但胜在兼容性好。绝大多数显示器、网页、手机都默认使用sRGB。

Adobe RGB则是Adobe公司在1998年推出的,色域比sRGB大了约50%,特别是在青绿色区域扩展明显。如果你做印刷或者专业摄影后期,Adobe RGB会更合适。我有个做印刷的朋友,他坚持用Adobe RGB工作流,因为sRGB印出来的绿色总是偏灰。

特性 sRGB Adobe RGB
推出时间 1996年 1998年
色域覆盖 约35% CIE色域 约50% CIE色域
Gamma值 约2.2 约2.2
白点 D65 D65
主要用途 网页、显示器、消费电子 印刷、专业摄影

这里要注意,虽然两者Gamma值都标称2.2,但sRGB的Gamma曲线其实是一个分段函数,在暗部区域有修正。Adobe RGB则使用纯幂函数。这个差异在暗部处理时会有影响,我在做色彩校正矩阵时,就因为这个分段Gamma吃过亏。

线性RGB与Gamma校正

为什么要有Gamma校正?这得从CRT显示器说起。老式显像管的亮度响应不是线性的——输入电压翻倍,亮度并不会翻倍,而是呈幂函数关系。为了补偿这个特性,我们在编码时预先做一次反向的幂函数变换,这就是Gamma校正。

Gamma校正的公式很简单:V_out = V_in ^ (1/γ)。对于sRGB,γ≈2.2。但实际应用中,sRGB的Gamma是分段函数:

// sRGB Gamma解码(线性化)
float srgb_to_linear(float c) {
    if (c <= 0.04045)
        return c / 12.92;
    else
        return pow((c + 0.055) / 1.055, 2.4);
}

// sRGB Gamma编码(非线性化)
float linear_to_srgb(float c) {
    if (c <= 0.0031308)
        return c * 12.92;
    else
        return 1.055 * pow(c, 1.0/2.4) - 0.055;
}

为什么要搞这么复杂?因为人眼对暗部变化更敏感。Gamma校正相当于把更多的编码资源分配给暗部,让暗部细节更丰富。你想想看,8位256个灰度级,如果线性分配,暗部可能只有几个级别,一量化就出现色阶断层。

💡 核心要点: 做色彩校正矩阵(CCM)时,一定要在线性RGB空间中进行。sRGB或Adobe RGB的像素值必须先解码到线性空间,做完矩阵运算,再重新编码回去。跳过这一步,你的CCM就是错的。

我记得有一次帮一个团队调试色彩算法,他们直接把sRGB的像素值丢进CCM矩阵,结果出来的颜色饱和度异常,暗部还出现了奇怪的偏色。我一看代码,发现少了Gamma解码这一步。加上之后,问题立刻解决了。

知识体系结构图

下面这张图总结了本章的核心逻辑,从颜色空间的基础概念,到具体标准,再到Gamma校正的工程实践,一目了然。

颜色空间知识体系 RGB颜色空间 sRGB(标准RGB) Adobe RGB Gamma≈2.2(分段函数) 色域约35% CIE,D65白点 Gamma≈2.2(纯幂函数) 色域约50% CIE,D65白点 线性RGB ↔ Gamma校正 CCM矩阵运算必须在线性RGB空间中进行
💡 实战建议: 在实际项目中,我建议你养成一个习惯:任何图像处理流水线,第一步先确认当前数据是在哪个颜色空间,是否经过了Gamma编码。如果是从相机RAW数据过来的,大概率是线性RGB;如果是JPEG或PNG,基本是sRGB。搞不清楚的时候,宁可多花5分钟验证,也别盲目下手。

好了,这一章的内容就到这里。颜色空间看似基础,但它是整个色彩校正的基石。你想想看,如果连颜色空间都没搞清楚,后面的CCM矩阵调优就是空中楼阁。下一章我们会深入CCM矩阵的数学原理,到时候这些基础概念会反复用到。


公众号:蓝海资料掘金营,微信deep3321