3. Gamma校正基础:人眼视觉特性与Gamma曲线数学原理
Gamma校正(Gamma Correction)是ISP(图像信号处理器)流水线中最基础、最核心的非线性处理环节。它并非简单的“调亮”或“调暗”,而是基于人眼视觉系统(HVS)对亮度感知的非线性特性,对图像信号进行重新映射,使有限的量化位数(如8bit/10bit)能够更高效地编码视觉信息。在后续的降噪处理中,Gamma校正的曲线形态直接影响噪声在亮区和暗区的分布特性,因此理解Gamma是联合优化的前提。
3.1 人眼视觉的亮度感知特性
人眼对亮度的感知并非线性,而是遵循韦伯-费希纳定律(Weber-Fechner Law)的近似对数关系。该定律指出:人眼能分辨的最小亮度差异(ΔL)与背景亮度(L)的比值近似恒定,即ΔL/L ≈ 常数。这意味着:
- 暗区敏感:在低亮度区域,人眼能分辨很小的亮度变化(ΔL小)。
- 亮区迟钝:在高亮度区域,人眼需要较大的亮度变化才能感知到差异(ΔL大)。
这一特性决定了:如果使用线性量化(如8bit 0-255均匀分布),暗区的量化步长会显得“粗糙”,导致暗部出现明显的条带效应(Banding);而亮区的量化步长又过于“精细”,造成比特浪费。Gamma校正正是为了解决这一矛盾而设计。
3.2 Gamma曲线的数学定义
在ISP领域,Gamma校正通常使用幂律函数(Power-Law Function)来描述。其标准数学形式为:
V_out = A * (V_in)^γ
其中:
- V_in :归一化输入亮度(范围 0.0 ~ 1.0)
- V_out :归一化输出亮度(范围 0.0 ~ 1.0)
- A :增益系数(通常 A=1.0,用于归一化)
- γ :Gamma指数(Gamma值)
在实际ISP硬件中,为了处理暗区噪声放大问题,通常会在低亮度区域引入一个线性偏移段(Offset/Footroom),形成分段Gamma曲线。海思平台常用的分段Gamma模型如下:
V_out =
| s * V_in , 0 ≤ V_in < V_th
| (1 + s*V_th) * (V_in)^γ - s*V_th , V_th ≤ V_in ≤ 1.0
其中:
- s :线性段斜率(通常 s = 4.5 ~ 5.0)
- V_th :线性段与幂律段的切换阈值(通常 V_th = 0.018 ~ 0.020)
- γ :Gamma指数(标准值 0.45,对应显示端 Gamma 2.2 的倒数)
3.3 Gamma校正的量化效率分析
为了直观理解Gamma校正如何提升量化效率,我们对比线性量化与Gamma校正后的量化步长分布。假设8bit系统(0-255),输入物理光强为线性:
| 亮度区域 | 物理光强范围 | 线性量化步长 | Gamma 0.45量化步长 | 人眼JND(Just Noticeable Difference) |
|---|---|---|---|---|
| 暗区(0-0.1) | 0 ~ 25.5 | 0.1(过粗 → 条带) | 0.035(精细) | ≈ 0.02 ~ 0.05 |
| 中间区(0.1-0.5) | 25.5 ~ 127.5 | 0.1(适中) | 0.08(适中) | ≈ 0.05 ~ 0.10 |
| 亮区(0.5-1.0) | 127.5 ~ 255 | 0.1(过细 → 浪费) | 0.18(粗放) | ≈ 0.10 ~ 0.20 |
从上表可以看出:Gamma校正将更多的量化级数分配给了人眼更敏感的暗区,而减少了亮区的量化级数。这种“感知量化”策略使得8bit图像在视觉上接近10bit线性量化的效果。
3.4 Gamma校正与噪声的耦合关系
Gamma校正对噪声的影响是后续降噪处理必须考虑的关键因素。其核心机制在于斜率放大效应:
- 暗区噪声放大:Gamma曲线在暗区(V_in 接近0)的斜率很大(导数 dV_out/dV_in > 1),这意味着暗区的输入噪声会被显著放大。例如,Gamma=0.45时,V_in=0.01处的斜率约为4.5倍,即暗区噪声被放大了4.5倍。
- 亮区噪声压缩:Gamma曲线在亮区(V_in 接近1)的斜率很小(导数 < 1),亮区的输入噪声会被压缩。
- 噪声分布非均匀化:经过Gamma校正后,原本均匀分布的传感器噪声(如光子散粒噪声)会变成非均匀分布——暗区噪声方差大,亮区噪声方差小。
3.5 海思平台Gamma调试参数速查
在海思ISP调试工具(如HiISP Tool)中,Gamma校正相关的关键参数如下表所示。理解这些参数与降噪的交互关系,是进行联合优化的基础。
| 参数名称 | 寄存器/模块 | 典型值范围 | 与降噪的交互关系 |
|---|---|---|---|
| Gamma Curve LUT | GAMMA_LUT[0:32] | 17/33/65点 | 曲线斜率决定噪声放大倍数;暗区斜率应配合Pre-NR强度 |
| Linear Segment Slope | GAMMA_LIN_SLOPE | 4.0 ~ 5.0 | 线性段斜率越大,暗区噪声放大越严重;建议≤4.5以控制噪声 |
| Threshold (V_th) | GAMMA_LIN_THR | 0.015 ~ 0.025 | 阈值越小,线性段越短,暗区噪声放大区域越大;需与NR暗区强度平衡 |
| R/G/B独立Gamma | GAMMA_R/G/B_LUT | 独立配置 | 用于白平衡后色彩校正;若三通道Gamma不一致,会导致彩色噪声放大差异 |
| DGC (Digital Gain Control) | DGC_GAIN | 1.0 ~ 16.0 | 数字增益在Gamma之前应用;增益越大,Gamma暗区噪声放大越严重 |