颜色空间概述:RGB颜色空间、sRGB与Adobe RGB、线性RGB与Gamma校正
各位同学,咱们今天聊聊颜色空间。说实话,我刚入行那会儿,觉得颜色嘛,不就是RGB三个数字嘛,有啥好研究的?结果第一次做色彩校正,出来的图像偏色偏得我怀疑人生。嗯,从那以后,我再也不敢小看这个基础概念了。
颜色空间,说白了就是一套用数字描述颜色的规则。不同的规则,描述出来的颜色范围、精度都不一样。你想想看,同样一个红色,在显示器上看和打印出来看,能一样吗?这就是颜色空间在背后搞鬼。
RGB颜色空间:最基础的加法混色
RGB颜色空间是最常见的颜色模型。它基于人眼对红、绿、蓝三种颜色的感知,通过不同强度的组合来产生各种颜色。我个人习惯把它想象成三盏不同颜色的手电筒,照在同一面墙上——光叠加得越多,颜色越亮,最终变成白色。这就是加法混色。
在RGB空间中,每个颜色通道通常用8位整数表示,范围0-255。比如纯红色是(255, 0, 0),纯白色是(255, 255, 255)。但这里有个坑——这个0-255的范围,其实对应的是非线性编码值,而不是真实的物理光强。我刚开始做项目时,就直接拿这些值去做颜色计算,结果算出来的颜色完全不对。
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个灰度级,如果线性分配,暗部可能只有几个级别,一量化就出现色阶断层。
我记得有一次帮一个团队调试色彩算法,他们直接把sRGB的像素值丢进CCM矩阵,结果出来的颜色饱和度异常,暗部还出现了奇怪的偏色。我一看代码,发现少了Gamma解码这一步。加上之后,问题立刻解决了。
知识体系结构图
下面这张图总结了本章的核心逻辑,从颜色空间的基础概念,到具体标准,再到Gamma校正的工程实践,一目了然。
好了,这一章的内容就到这里。颜色空间看似基础,但它是整个色彩校正的基石。你想想看,如果连颜色空间都没搞清楚,后面的CCM矩阵调优就是空中楼阁。下一章我们会深入CCM矩阵的数学原理,到时候这些基础概念会反复用到。
公众号:蓝海资料掘金营,微信deep3321