1、伽马校正基础:人眼视觉特性与伽马曲线原理
各位同学好,我是负责ISP图像管线的工程师。今天咱们聊聊伽马校正——这个在相机里天天跑、但很多人知其然不知其所以然的东西。
说实话,我刚入行那会儿也觉得伽马校正不就是个曲线嘛,套上去就完事了。直到有一次调试一款低光照摄像头,画面暗部细节全丢了,亮部又过曝,我才真正去深挖它背后的原理。嗯,这节课咱们就把这块地基打牢。
1.1 人眼为什么“不线性”?
先问一个问题:人眼对亮度的感知是线性的吗?
答案是否定的。你想想看,在漆黑的房间里点一根蜡烛,你会觉得“哇,好亮”。但在大太阳底下再加一根蜡烛,你根本感觉不到变化。这就是人眼的非线性响应特性——对暗部变化极其敏感,对亮部变化越来越迟钝。
这个规律最早由德国物理学家Ernst Weber发现,后来被Gustav Fechner总结成公式:
韦伯-费希纳定律:人眼感知的亮度变化 ≈ log(实际物理亮度)
说白了,人眼是个“对数探测器”。物理亮度翻一倍,人眼感觉到的亮度增量并不是一倍,而是越来越小。这个特性在进化上很有意义——让我们在从月光到正午的10个数量级动态范围内都能看清东西。
1.2 显示设备的“反人性”
但问题来了。我们的显示设备——CRT、LCD、OLED——它们的亮度响应是线性的吗?
也不是。而且恰好相反。
以老式CRT显像管为例,它的物理亮度与输入电压之间呈幂律关系:
物理亮度 = (输入电压) ^ γ
这个γ值大约在2.2到2.5之间。也就是说,你给显示器输入50%的电压,它输出的亮度只有大约22%(0.5^2.2 ≈ 0.22)。
这就尴尬了:
- 人眼:对暗部敏感,对亮部迟钝(对数特性)
- 显示器:暗部压缩,亮部拉伸(幂律特性)
如果不做任何处理,你拍出来的照片在显示器上看,暗部会一团黑,亮部会白成一片。我在项目中遇到过这种情况——第一次调完raw图觉得完美,结果放到显示器上一看,暗部细节全没了。当时我还以为是显示器坏了,后来才意识到是伽马没处理好。
1.3 伽马校正:两头“骗”的艺术
那怎么办?很简单——在图像数据进入显示器之前,先做一个反向的幂律变换。
这个反向变换就叫伽马校正:
输出像素值 = (输入像素值) ^ (1/γ)
通常γ取2.2,所以校正指数是1/2.2 ≈ 0.4545。
整个过程是这样的:
- 采集端:传感器线性记录场景亮度
- 编码端:对线性数据进行伽马校正(1/2.2次幂)
- 存储/传输:用8bit或10bit保存校正后的数据
- 显示端:显示器自然产生2.2次幂的亮度响应
- 最终:人眼看到接近线性的亮度感知
你看,伽马校正的本质就是用编码端的“预失真”去抵消显示端的“后失真”。两头一凑,人眼就舒服了。
一个小技巧:我习惯把伽马校正理解为“给暗部多分一点码字”。8bit数据只有256个灰度级,如果不做伽马校正,暗部可能只分到十几个码字,一量化就出现色阶断层。做了伽马校正后,暗部能分到50-60个码字,过渡就平滑多了。
1.4 标准伽马曲线与sRGB
现在业界最通用的伽马标准是sRGB。它不是一个简单的幂函数,而是一个分段函数:
// sRGB 伽马校正(线性→非线性)
if (L <= 0.0031308) {
V = 12.92 * L;
} else {
V = 1.055 * pow(L, 1/2.4) - 0.055;
}
// sRGB 逆伽马校正(非线性→线性)
if (V <= 0.04045) {
L = V / 12.92;
} else {
L = pow((V + 0.055) / 1.055, 2.4);
}
为什么不用简单的1/2.2?因为sRGB在暗部加了一段线性区(斜率12.92),目的是避免纯幂函数在接近0时导数无穷大带来的量化噪声。这个细节我在高通平台调sensor时踩过坑——直接用pow(1/2.2)做校正,暗部噪点被放大了好几倍。
| 参数 | sRGB标准 | 传统CRT | BT.709 |
|---|---|---|---|
| γ值 | 2.4(近似) | 2.2~2.5 | 2.4 |
| 线性段阈值 | 0.0031308 | 无 | 0.018 |
| 线性段斜率 | 12.92 | 无 | 4.5 |
| 主要应用 | 互联网、PC | 老式电视 | 高清电视 |
注意:千万不要在ISP管线里对raw域数据直接做sRGB伽马校正。raw数据是线性的,但sRGB假设输入已经是经过白平衡和颜色校正后的线性RGB。我在一个项目中看到有人把sRGB曲线直接套在raw上,结果颜色全偏了,暗部还出现了奇怪的条纹。
1.5 为什么需要伽马校正?——三个核心原因
总结一下,伽马校正的必要性来自三个方面:
- 匹配人眼感知:人眼对暗部敏感,伽马校正给暗部分配更多码字,让量化误差在人眼最敏感的区域最小化
- 匹配显示设备:CRT/LCD/OLED都有固有的非线性响应,伽马校正提前补偿这个失真
- 优化码字分配:在有限的bit深度下(8bit/10bit),把码字分配到人眼能感知的差异上,而不是浪费在人眼看不出的亮部
说白了,伽马校正就是在传感器、人眼、显示器三者之间搭一座桥。没有它,数字成像系统根本没法正常工作。
1.6 本章知识结构
下面这张图把伽马校正的完整逻辑串起来了:
从这张图可以看得很清楚:伽马校正不是凭空造出来的,而是为了解决人眼和显示器两头“不线性”的问题。它上接感知科学,下连硬件实现,是ISP管线里承上启下的关键环节。