3. 黑电平校正(BLC)——把“假黑”变成“真黑”

黑电平校正,圈里人常叫 BLC(Black Level Correction)。

说白了,就是让传感器在完全没光的时候,输出信号正好是 0。但现实没这么完美——传感器本身有暗电流,读出电路也有偏置,导致“全黑”画面看起来发灰发绿。我刚开始调 ISP 时,就吃过这个亏:一台 IPC 夜视模式下画面偏紫,折腾半天,最后发现是 BLC 没调对。

3.1 黑电平是怎么产生的?

黑电平不是 bug,是物理规律。主要有三个来源:

  • 暗电流:半导体热激发产生的电子,温度越高越明显。夏天户外相机黑电平能比冬天高 10~20 LSB。
  • 读出电路偏置:ADC 和模拟前端为了避开噪声死区,会加一个固定偏置电压。
  • 像素工艺差异:R/G/B 通道的暗电流不一致,导致黑电平不均衡。我见过某款 sensor,B 通道黑电平比 R 通道高 8 LSB,不校正的话暗部偏蓝。

关键指标:黑电平通常用 LSB(Least Significant Bit)表示。10-bit sensor 的黑电平典型值在 32~64 LSB 之间,12-bit 的在 128~256 LSB 之间。

3.2 BLC 校正原理——减法艺术

校正原理其实很简单:测出黑电平值,然后从每个像素中减掉它。

但怎么测?有两种主流方法:

方法 原理 优点 缺点
光学黑区(OB) 传感器边缘有被遮光的像素,直接读它们的平均值 实时、准确、不占额外资源 OB 区域有限,统计样本少
暗场标定 在产线上拍一张全黑图,存下每个像素的偏移量 像素级校正,精度最高 需要产线工序,存储空间大

我个人的习惯是:量产用 OB 法,高端产品加暗场标定做二次校正。OB 法够快,但遇到 sensor 一致性差的批次,暗场标定能救回来。

校正公式也很直白:

// 伪代码:BLC 校正
// ob_avg 是光学黑区平均值
// target 是目标黑电平(通常为 0 或 16)
for each pixel in frame:
    corrected_pixel = raw_pixel - (ob_avg - target)
    if corrected_pixel < 0:
        corrected_pixel = 0  // 钳位到 0

小技巧:目标黑电平不一定要设为 0。我习惯留 16 LSB 的余量,防止减过头导致暗部细节丢失。尤其是 10-bit 系统,减到 0 后暗部噪声会被截断,画面出现“死黑”。

3.3 BLC 参数调试实战

调试 BLC 需要三个工具:全黑图、灰阶卡、示波器(或直方图工具)。

下面是我常用的调试流程:

  1. 拍全黑图:盖上镜头盖,确保完全遮光。环境温度控制在 25°C ± 2°C。
  2. 观察直方图:看 R/G/B 三个通道的峰值位置。正常应该在 32~64 LSB(10-bit)。
  3. 调整 OB 区域选择:有些 sensor 的 OB 区域边缘有漏光,要避开。我遇到过 OB 行数选错,导致校正后画面顶部偏暗。
  4. 逐通道微调:R/G/B 分别设置目标黑电平,让三个通道在全黑下输出一致。
  5. 验证动态范围:拍灰阶卡,检查暗部 1%~5% 灰阶是否可见。

注意:BLC 必须在 增益(Gain)之前 做。如果先放大再减黑电平,暗电流噪声会被放大,信噪比下降。ISP pipeline 的顺序是:BLC → 去噪 → 增益 → 白平衡。

下面这张图展示了 BLC 在 ISP 流程中的位置:

ISP Pipeline 中 BLC 的位置 Raw 输入 BLC 校正 去噪 增益 AWB 为什么 BLC 必须在增益之前? 假设暗电流噪声 = 10 LSB,增益 = 4x。 ❌ 先增益后 BLC:噪声被放大到 40 LSB,再减 10 LSB,残留 30 LSB。 ✅ 先 BLC 后增益:先减 10 LSB,噪声归零,再增益 4x,噪声仍为 0。 结论:BLC 位置错了,暗部信噪比直接崩掉。

3.4 常见问题与避坑

调试 BLC 时,我踩过的坑比调过的参数还多。下面几个是高频问题:

  • 黑电平随温度漂移:sensor 温度每升高 10°C,暗电流翻倍。我建议在 -20°C、25°C、60°C 三个温度点标定,做温度补偿表。
  • OB 区域被污染:有些模组的 OB 区域密封不好,漏光。我遇到过一批 IPC,白天画面正常,晚上偏色,最后发现是 OB 区进了杂光。
  • 减过头导致负值:校正后像素值小于 0,被钳位到 0,暗部细节丢失。解决办法是留余量,或者用线性映射代替硬钳位。
  • 通道间黑电平不一致:R/G/B 三个通道的 OB 平均值不同,校正后暗部偏色。我习惯每个通道独立计算 OB 均值,而不是用全局均值。

避坑指南:我曾经在调试一款 4K sensor 时,发现画面左上角始终偏暗。查了三天,最后发现是 OB 区域选择框超出了有效像素区,读到了无效数据。从那以后,我每次都会用 sensor 的 datasheet 确认 OB 区域的行列范围。

最后说一句:BLC 调好了,画面暗部干净、色彩准确;调不好,后面所有模块都在给 BLC 擦屁股。别小看这个减法,它是 ISP 的基石。