1. Gamma 校正基础:数学原理与视觉生理学背景
Gamma 校正是 ISP 流水线中最基础、最核心的非线性变换之一。它直接利用人眼对亮度感知的非线性特性,在保持视觉信息完整性的同时,优化量化精度与显示匹配。本章从视觉生理学出发,推导 Gamma 校正的数学形式,并建立工程直觉。
1.1 人眼亮度感知的非线性特性
人眼对物理亮度的响应并非线性,而是遵循 Stevens 幂律 或近似对数关系。实验表明,人眼在暗区对亮度变化更敏感,在亮区则相对迟钝。这种机制使视觉系统能在极大动态范围(约 10^10:1)中保持对比度分辨能力。
关键生理事实: 人眼感知亮度 ≈ (物理亮度)^(0.33~0.5)。这意味着物理亮度翻倍时,人眼感知到的亮度变化远小于翻倍。
下图展示了物理亮度与人眼感知亮度之间的非线性映射关系:
1.2 Gamma 校正的数学定义
Gamma 校正通过幂律变换将线性域信号映射到感知均匀域,或反之。其标准形式为:
V_out = A · V_in^γ
其中:
V_in :输入归一化亮度(0~1)
V_out :输出归一化亮度(0~1)
γ :Gamma 指数(gamma value)
A :增益系数(通常 A=1)
在 ISP 和显示系统中,通常使用两个方向的 Gamma:
| 应用方向 | Gamma 值 | 数学形式 | 典型场景 |
|---|---|---|---|
| 编码 Gamma(线性→感知) | γ ≈ 0.45 | V_out = V_in^0.45 | ISP 内部、图像传感器原始数据 |
| 解码 Gamma(感知→线性) | γ ≈ 2.2 | V_out = V_in^2.2 | 显示器、sRGB 标准 |
| sRGB 近似 | 分段函数 | 线性段 + 幂律段 | 互联网、消费电子 |
工程记忆口诀: 编码用 0.45(压缩暗部),解码用 2.2(扩展暗部)。两者互为倒数:0.45 × 2.2 ≈ 1.0。
1.3 为什么需要 Gamma 校正?——量化效率分析
如果不对传感器数据进行 Gamma 编码,直接使用线性量化,会导致暗部量化台阶过大、亮部量化台阶过小,严重浪费码字资源。以下表格对比了 8-bit 线性量化与 Gamma 编码后的量化步长:
| 物理亮度区间 | 线性量化步长(8-bit) | Gamma 编码步长(γ=0.45) | 人眼感知差异 |
|---|---|---|---|
| 0.00 ~ 0.05(暗部) | 0.00039(过粗) | 0.00012(精细) | ✅ 匹配人眼高灵敏度 |
| 0.05 ~ 0.50(中间) | 0.00176 | 0.00102 | ✅ 适中 |
| 0.50 ~ 1.00(亮部) | 0.00196(过细) | 0.00345(粗放) | ✅ 匹配人眼低灵敏度 |
可见,Gamma 编码将有限的码字资源重新分配:暗部获得更多量化级,亮部减少冗余量化级,从而在整体上降低视觉可感知的量化噪声。
1.4 Gamma 校正在 ISP 流水线中的位置
下图展示了 Gamma 校正模块在典型 ISP 流水线中的前后级关系:
工程注意: Gamma 校正必须在黑电平校正(BLC)和镜头阴影校正(LSC)之后执行,因为这些模块要求输入为线性数据。如果在 Gamma 之后做 BLC,会引入非线性偏移,导致暗部偏色。
1.5 sRGB 标准中的 Gamma 近似
sRGB 标准没有直接使用纯幂律 γ=2.2,而是采用分段函数,在极暗区使用线性段以避免无穷大斜率带来的噪声放大:
V_out =
12.92 · V_in , 当 V_in ≤ 0.0031308
1.055 · V_in^(1/2.4) - 0.055 , 当 V_in > 0.0031308
这种分段设计在工程上有两个关键优势:
- 避免暗部噪声放大: 线性段斜率 12.92 限制了暗部增益,防止传感器读出噪声被过度放大。
- 兼容 CRT 显示: 早期 CRT 的物理响应近似 γ=2.2,sRGB 的 1/2.4 指数配合线性段,整体逼近 2.2 曲线。
1.6 本章小结
| 核心概念 | 要点 |
|---|---|
| 人眼感知特性 | 暗区敏感、亮区迟钝,遵循幂律(γ≈0.33~0.5) |
| Gamma 数学形式 | V_out = V_in^γ,编码 γ=0.45,解码 γ=2.2 |
| 量化效率 | Gamma 编码将更多码字分配给暗部,减少视觉量化噪声 |
| ISP 位置 | 位于 BLC/LSC 之后、降噪/色彩校正之前 |
| sRGB 分段设计 | 线性段 + 幂律段,避免暗部噪声放大 |