4. Gamma 校正核心参数:Gain、Offset、Curve Table 的配置方法

Gamma 校正的最终效果由三个核心参数共同决定:Gain(增益)、Offset(偏移) 和 Curve Table(曲线查找表)。在海思 ISP 平台上,这三个参数并非独立工作,而是通过特定的数学公式组合成最终的映射曲线。理解每个参数的作用域和配置边界,是进行 Gamma 与 WDR 联动优化的基础。

核心公式: 海思 Gamma 模块的最终输出亮度 Y_out 由以下公式计算:
Y_out = Curve_Table[ (Y_in × Gain) + Offset ]
其中 Y_in 为归一化后的输入亮度(范围 0.0 ~ 1.0),Gain 和 Offset 对输入进行线性调整,Curve_Table 完成非线性映射。

4.1 Gain(增益)参数配置

Gain 参数在输入信号进入 Curve Table 查找之前,对亮度值进行全局缩放。其典型配置范围在 0.5 ~ 2.0 之间,步长通常为 0.01。

  • 物理含义: 相当于在 Gamma 校正前对图像进行数字曝光补偿。Gain > 1.0 会整体提亮暗部,但也会压缩高光动态范围;Gain < 1.0 会压暗整体画面,但能保留更多高光细节。
  • 与 WDR 的联动: 在 WDR 开启时,Gain 不宜超过 1.2,否则会放大 WDR 融合后的噪声,导致暗部出现明显颗粒感。
  • 配置建议: 标准场景下 Gain 保持为 1.0;低照度场景可提升至 1.1 ~ 1.3;强逆光场景建议降低至 0.8 ~ 0.9,配合 WDR 的高光压缩使用。
避坑指南: 不要将 Gain 作为主要的亮度调节手段。Gain 的线性缩放会破坏 Curve Table 精心设计的非线性特性。优先通过调整 Curve Table 的输入输出映射来改变亮度,Gain 仅用于微调或应对极端光照变化。

4.2 Offset(偏移)参数配置

Offset 参数在 Gain 缩放之后、查表之前,对亮度值进行整体平移。其典型配置范围在 -0.1 ~ 0.1 之间,步长通常为 0.001。

  • 物理含义: 用于校正黑电平偏移或传感器暗电流引起的底噪。正偏移会使暗部发灰(黑电平抬升),负偏移会使暗部更黑(黑电平压缩)。
  • 与 WDR 的联动: WDR 融合后的图像在暗部区域可能存在微小的亮度跳变,通过 Offset 的负向微调(-0.005 ~ -0.02)可以有效抑制暗部闪烁。
  • 配置建议: 大多数场景下 Offset 保持为 0.0。仅在暗部出现明显偏色或闪烁时,以 0.001 的步长进行微调。Offset 的值超过 0.05 时,通常表明传感器黑电平校准存在问题。
参数 典型范围 步长 主要作用 WDR 场景限制
Gain 0.5 ~ 2.0 0.01 全局亮度缩放 建议 ≤ 1.2
Offset -0.1 ~ 0.1 0.001 黑电平偏移校正 建议 -0.02 ~ 0.0
Curve Table 0.0 ~ 1.0 (归一化) 1024 点 / 4096 点 非线性亮度映射 需配合 WDR 曲线

4.3 Curve Table(曲线查找表)配置方法

Curve Table 是 Gamma 校正的核心,它是一个包含 1024 或 4096 个点的一维查找表,定义了从输入亮度到输出亮度的映射关系。在海思平台上,Curve Table 的配置通常通过 API 接口 传入一个浮点数组实现。

4.3.1 标准 Gamma 曲线生成

标准 Gamma 曲线的数学表达式为:

Y_out = Y_in ^ (1 / Gamma_value)

其中:
- Y_in 为归一化输入亮度(0.0 ~ 1.0)
- Y_out 为归一化输出亮度(0.0 ~ 1.0)
- Gamma_value 为 Gamma 系数,典型值为 0.45(对应 Gamma 2.2 校正)

在海思平台上生成 1024 点 Curve Table 的示例代码:

// 生成标准 Gamma 2.2 曲线(1024 点)
float gamma_table[1024];
float gamma_value = 0.45f;  // 1 / 2.2

for (int i = 0; i < 1024; i++) {
    float y_in = (float)i / 1023.0f;
    float y_out = powf(y_in, gamma_value);
    gamma_table[i] = y_out;
}

// 通过海思 API 写入 Gamma 模块
HI_MPI_ISP_SetGammaTable(pipe_id, gamma_table, 1024);

4.3.2 WDR 联动曲线设计

当 WDR 开启时,标准 Gamma 曲线需要针对 WDR 的亮度分布特性进行调整。WDR 融合后的图像在暗部和中灰区域包含更多细节信息,因此曲线需要在 0.0 ~ 0.4 输入区间 提升斜率,以增强暗部对比度;在 0.7 ~ 1.0 输入区间 降低斜率,以保留高光细节。

WDR 联动曲线核心原则: 暗部提亮但不牺牲信噪比,高光压缩但不产生色阶断层。曲线在 0.0 ~ 0.2 区间的斜率应比标准 Gamma 曲线高 20% ~ 40%,在 0.8 ~ 1.0 区间的斜率应比标准 Gamma 曲线低 30% ~ 50%。

WDR 联动曲线的分段设计示例:

// WDR 联动 Gamma 曲线(分段设计)
float wdr_gamma_table[1024];
float gamma_base = 0.45f;

for (int i = 0; i < 1024; i++) {
    float y_in = (float)i / 1023.0f;
    float y_out;

    if (y_in < 0.2f) {
        // 暗部:提升斜率,增强对比度
        y_out = powf(y_in, gamma_base * 0.75f);
    } else if (y_in < 0.7f) {
        // 中灰:保持标准 Gamma
        y_out = powf(y_in, gamma_base);
    } else {
        // 高光:降低斜率,压缩动态范围
        y_out = powf(y_in, gamma_base * 1.4f);
    }

    wdr_gamma_table[i] = y_out;
}

4.4 参数配置流程与验证

在海思 ISP 调试工具中,配置 Gamma 核心参数的推荐流程如下:

  1. 初始化: 将 Gain 设为 1.0,Offset 设为 0.0,加载标准 Gamma 2.2 曲线。
  2. 粗调 Curve Table: 根据场景亮度分布,调整曲线形状。暗部场景提升低段斜率,亮部场景降低高段斜率。
  3. 微调 Gain: 观察图像整体亮度,若偏暗则小幅提升 Gain(≤ 1.2),若偏亮则小幅降低 Gain(≥ 0.8)。
  4. 校正 Offset: 检查暗部是否发灰或闪烁,以 0.001 步长微调 Offset 至暗部纯净。
  5. WDR 联动验证: 在 WDR 开启/关闭两种状态下,分别检查暗部细节、高光过曝和整体对比度,确保曲线在两种模式下均表现良好。
Gamma 核心参数配置流程 1. 初始化参数 2. 粗调 Curve Table 3. 微调 Gain 4. 校正 Offset 5. WDR 联动验证 不满足则返回步骤 2 每次修改后需实时预览效果 避免一次性大幅调整多个参数

4.5 参数配置的常见问题与排查

现象 可能原因 排查与解决
暗部发灰、黑电平抬升 Offset 正值过大 将 Offset 逐步降低至 0.0 或负值,观察暗部变化
高光过曝、细节丢失 Curve Table 高段斜率过高 降低 0.7 ~ 1.0 区间的曲线斜率,或降低 Gain 值
暗部噪声明显 Gain 过大或 Curve Table 低段斜率过高 降低 Gain 至 1.0 以下,同时降低 0.0 ~ 0.2 区间斜率
WDR 开启后亮度跳变 Offset 未校准或 Curve Table 不连续 微调 Offset(-0.01 ~ -0.005),检查曲线是否平滑
整体对比度不足 Curve Table 中段斜率过低 提升 0.2 ~ 0.6 区间的曲线斜率,增强中灰对比度
调试经验: 在海思平台上,Curve Table 的配置建议使用 4096 点模式(如果硬件支持),因为更多的采样点可以更精细地控制曲线形状,尤其是在 WDR 联动场景下,避免因采样点不足导致的亮度阶梯效应。同时,每次修改 Curve Table 后,务必检查曲线的一阶导数是否连续,不连续的导数会导致图像出现伪轮廓。