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编码输出。这是铁律,不要挑战。

线性化处理的步骤其实很简单:

  1. 读取图像数据——确认当前色彩空间和位深
  2. 去除Gamma编码——对每个像素应用逆Gamma变换
  3. 转换到浮点——将整数[0,255]映射到浮点[0.0, 1.0]
  4. 执行处理——在浮点线性空间做所有运算
  5. 重新编码——处理完成后,再应用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和线性曲线在暗部的差异。

Gamma曲线对比(暗部放大) 输入(编码值) 1.0 0 输出(亮度) 1.0 sRGB γ=2.2 线性 暗部细节区 sRGB 纯γ=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校正看起来简单,但它是整个色彩校正体系的基石。你想想看,如果连图像是不是线性的都不确定,后面做的所有矩阵运算、白平衡调整、畸变矫正,都像是在沙子上盖楼。把这个基础打牢了,后面讲色彩矩阵和色温校正时,你会觉得顺畅很多。