3、色彩校正基础:Gamma校正原理、线性化处理、sRGB与AdobeRGB标准
说到色彩校正,Gamma校正是绕不开的第一个坎。很多刚入行的朋友觉得Gamma就是个简单的幂次运算,调个参数就完事了。嗯,真这么简单就好了。
我刚开始做图像处理那会儿,接过一个医疗内窥镜的项目。图像传回来颜色总是偏暗,皮肤纹理细节全糊在一起。我折腾了三天,改曝光、调增益,效果都不理想。后来一位老前辈看了一眼,说:“你先把Gamma曲线拉直再说话。” 从那以后,我才真正理解线性化处理的重要性。
3.1 Gamma校正原理
Gamma校正的起源其实很“物理”。早期的CRT显示器,输入电压和输出亮度之间不是线性关系,而是近似一个2.2次幂的曲线。也就是说,你给显示器一半的电压,它不会显示一半的亮度,而是只有大约22%的亮度。
为了补偿这个非线性,我们在编码图像时,故意先做一个1/2.2次幂的“预失真”。这样信号经过显示器后,最终人眼看到的亮度就是线性的了。这个过程,就是Gamma校正。
核心公式:
- 编码端(预补偿): Vout = Vin1/γ
- 显示端(解码): Ldisplay = Voutγ
- 标准γ值: 2.2(sRGB/Rec.709)
你可能会问:为什么不用线性直接传?因为人眼对暗部细节更敏感。Gamma曲线在暗部分配了更多的编码位数,这样我们就能在8bit的有限空间里,保留更多的暗部层次。说白了,这是一种“视觉感知优化”的编码策略。
3.2 线性化处理——调试的第一步
做色彩校正和镜头畸变联合调试,第一件事就是把图像拉回线性空间。为什么?因为所有的颜色混合、矩阵运算、畸变矫正算法,都是基于“光强度可加性”这个假设的。如果图像还是Gamma编码的非线性数据,你算出来的结果全是错的。
我曾经踩过一个坑:在调试一个广角镜头的桶形畸变时,我直接在sRGB图像上做像素重映射。结果矫正后的图像边缘出现了明显的色晕,怎么调都调不掉。后来才发现,问题出在插值算法上——非线性空间里的插值,相当于在错误的空间做加权平均,颜色当然会漂移。
⚠️ 重要提醒:
所有几何变换(畸变矫正、透视变换、缩放旋转)都必须在线性RGB空间进行。做完几何变换后,再重新应用Gamma编码输出。这是铁律,不要挑战。
线性化处理的步骤其实很简单:
- 读取图像数据——确认当前色彩空间和位深
- 去除Gamma编码——对每个像素应用逆Gamma变换
- 转换到浮点——将整数[0,255]映射到浮点[0.0, 1.0]
- 执行处理——在浮点线性空间做所有运算
- 重新编码——处理完成后,再应用Gamma编码输出
// 线性化处理示例(C++风格伪代码)
float linearize(float pixel, float gamma = 2.2) {
// 将sRGB非线性值转换为线性值
if (pixel <= 0.04045) {
return pixel / 12.92;
} else {
return pow((pixel + 0.055) / 1.055, gamma);
}
}
float encodeGamma(float linear, float gamma = 2.2) {
// 将线性值转换回sRGB非线性值
if (linear <= 0.0031308) {
return linear * 12.92;
} else {
return 1.055 * pow(linear, 1.0/gamma) - 0.055;
}
}
3.3 sRGB与AdobeRGB标准
这两个标准,是我们在实际项目中最常打交道的色彩空间。很多人以为它们只是色域大小不同,其实Gamma曲线也有细微差别。
| 特性 | sRGB | Adobe RGB |
|---|---|---|
| 推出年份 | 1996(微软+惠普+爱普生) | 1998(Adobe) |
| 色域覆盖 | 约35% CIE Lab | 约50% CIE Lab |
| Gamma曲线 | 近似2.2(分段函数) | 纯2.2 |
| 白点 | D65 | D65 |
| 主要用途 | 网页、显示器、消费电子 | 印刷、专业摄影 |
| 绿色主色坐标 | (0.3000, 0.6000) | (0.2100, 0.7100) |
sRGB的Gamma曲线其实不是严格的2.2,它在暗部有一段线性区(斜率12.92),目的是为了减少量化噪声。Adobe RGB则直接使用纯2.2的幂函数,没有这个线性段。
💡 我的个人习惯:
在做色彩校正调试时,我通常会在内部统一使用线性sRGB空间。如果源图像是Adobe RGB,我会先做色域转换到sRGB,再做线性化。这样能减少一个变量,调试起来更可控。
3.4 三种标准的Gamma曲线对比
为了让你更直观地理解,我画了一张对比图。这张图展示了sRGB、纯Gamma 2.2和线性曲线在暗部的差异。
从图上可以清楚看到,sRGB和纯Gamma 2.2在暗部(输入值0~0.2区间)有明显差异。sRGB的线性段让它在极暗区域更“亮”一些,这有助于减少量化条带。但在做色彩校正时,这个差异必须考虑进去。
3.5 实战中的选择建议
说了这么多理论,落到实际项目里,我一般这样选:
- 消费电子(手机、显示器、网页):无脑用sRGB。兼容性最好,生态最成熟。
- 专业印刷、摄影后期:用Adobe RGB。色域更广,绿色表现力强,印刷品能还原更多色彩。
- 视频制作:用Rec.709(和sRGB Gamma一致,但色域略有不同)。
- HDR内容:用Rec.2020 + PQ/HLG曲线,Gamma那套就不适用了。
📌 核心要点总结:
- Gamma校正的本质是“编码端预失真,显示端还原”,目的是优化视觉感知和量化效率
- 所有几何变换和色彩混合运算,必须在线性空间进行
- sRGB和Adobe RGB的Gamma曲线有细微差异,sRGB在暗部有线性段
- 调试时建议统一到线性sRGB空间,减少变量
嗯,这一章的内容就到这里。Gamma校正看起来简单,但它是整个色彩校正体系的基石。你想想看,如果连图像是不是线性的都不确定,后面做的所有矩阵运算、白平衡调整、畸变矫正,都像是在沙子上盖楼。把这个基础打牢了,后面讲色彩矩阵和色温校正时,你会觉得顺畅很多。