安防监控黑电平与镜头阴影校正实战 - 第2节

2. 黑电平校正(BLC)基础概念

黑电平校正,圈内人常叫 BLC(Black Level Correction)。说白了,就是告诉传感器:什么才算真正的“黑”。

你想想看,一个像素完全没光照时,理想输出应该是 0。但现实呢?传感器有暗电流,有读出噪声,输出值往往在 16、32 甚至 64 左右。这个底数,就是黑电平。

我刚开始做 ISP 时,觉得 BLC 不就是减个固定值嘛,简单。后来被一个项目狠狠教育了——画面暗部偏紫,怎么调都调不回来。查了三天,才发现是黑电平没对准,不同区域的底数不一样。

全局黑电平:一刀切的做法

全局黑电平,就是对整幅图像用一个固定值做减法。比如 sensor 输出 10bit RAW,黑电平标称 64,那就所有像素都减 64。

优点很明显:

  • 实现简单,硬件开销小
  • 处理速度快,不占带宽
  • 适合低端 sensor 或入门级方案

缺点也致命:

  • 忽略 sensor 不同区域的差异
  • 暗角区域容易偏色
  • 温度变化时误差大
注意: 全局黑电平在安防监控中风险很高。夜间场景暗部细节多,一刀切减法会让边缘像素要么欠减(偏紫),要么过减(裁掉暗部细节)。我曾经在一个枪机项目里吃过这个亏,后来再也不敢在高端产品上用全局 BLC 了。

局部黑电平:精细到区域的校正

局部黑电平,也叫逐行黑电平或区域黑电平。它把 sensor 的像素阵列分成若干区域,每个区域独立计算黑电平值。

怎么分?常见两种方式:

  1. 行级 BLC:每行像素都有自己的黑电平,从该行的光学黑像素(OB,Optical Black)中提取。
  2. 网格 BLC:把画面分成 M×N 网格,每个网格独立计算,然后插值到每个像素。
对比项 全局黑电平 局部黑电平
精度 低,全图统一 高,逐区域独立
硬件开销 小,一个减法器 大,需要存储和插值
温度适应性 差,温漂明显 好,实时跟踪
偏色风险 高,尤其暗角区域 低,各通道独立校正
适用场景 低端 IPC、室内固定光照 高端球机、低照度、宽动态
我的经验: 做安防监控,尤其是带红外补光的枪机,局部黑电平几乎是必选项。红外 LED 开启后,sensor 边缘温度升高,暗电流变化剧烈。全局 BLC 根本扛不住,画面四角发红发紫。换成行级 BLC 后,问题直接解决。

为什么局部黑电平更准?

原因就一个:sensor 的暗电流不是均匀的。

影响暗电流的因素很多:

  • 温度梯度:芯片中心热,边缘冷,暗电流差好几倍
  • 工艺偏差:同一片 wafer 上不同 die 的底噪都不一样
  • 读出路径:列放大器增益差异,导致列间黑电平偏移
  • 光照串扰:强光区域的电荷可能泄漏到暗区

全局 BLC 只取一个平均值,相当于用“平均身高”给所有人做衣服——高个穿短裤,矮个穿长袍。局部 BLC 则是量体裁衣,每个区域都有自己的“尺码”。

BLC 在 ISP Pipeline 中的位置

这个问题,面试时经常被问到。我直接画个图给你看。

ISP Pipeline 中 BLC 的位置 RAW 输入 BLC LSC AWB / CCM Gamma 去噪 锐化 YUV 输出 关键说明: 1. BLC 必须在 RAW 域、去马赛克之前完成,否则黑电平误差会被插值放大。 2. BLC 之后紧接 LSC(镜头阴影校正),因为黑电平不准会直接影响 LSC 的增益计算。 3. 部分 sensor 内部已经做了 BLC,ISP 端只需做微调或不做。

从图上你能看到,BLC 是 RAW 域的第一个处理模块。为什么?

因为后面所有模块——LSC、AWB、去噪、锐化——都假设输入数据是“零基准”的。如果黑电平没校正好,后面的增益和矩阵运算会把误差放大好几倍。

小技巧: 调试时,我习惯先关掉所有 ISP 模块,只开 BLC,然后看 RAW 直方图。理想情况下,暗部峰值应该落在 0 附近。如果偏了,说明 BLC 参数没设对。这个习惯帮我省了不少排查时间。

BLC 在硬件 pipeline 中的具体位置

以主流安防 SoC 为例,典型的 RAW 处理顺序是:

  1. Sensor 输出 RAW10/RAW12 —— 此时数据包含黑电平偏移
  2. BLC 模块 —— 减去黑电平,恢复零基准
  3. 坏点校正(DPC) —— 修复 sensor 坏点
  4. 镜头阴影校正(LSC) —— 补偿镜头暗角
  5. 去马赛克(Demosaic) —— 插值成 RGB
  6. 白平衡(AWB) —— 校正色温
  7. 颜色校正矩阵(CCM) —— 颜色还原
  8. Gamma / 去噪 / 锐化 —— 后续处理

注意第 2 步和第 3 步的顺序。有些方案把 DPC 放在 BLC 前面,我个人不建议这么做。因为坏点检测依赖像素间的相对关系,黑电平没校准时,暗区的坏点容易被漏检。

避坑指南: 我曾经在一个项目中,把 BLC 和 DPC 的顺序搞反了。结果暗部坏点全部漏检,画面像撒了芝麻。后来查了三天才找到原因——黑电平偏移导致坏点阈值判断失效。从那以后,我坚持 BLC 必须排在 DPC 前面。

BLC 参数从哪里来?

BLC 的参数不是拍脑袋定的。通常来自两个途径:

  • Sensor 寄存器读取:很多 sensor 内部有 OB 像素,芯片会自动计算黑电平,ISP 通过 I2C 读取即可。
  • 标定数据:在产线上用均匀黑场(盖上镜头盖)采集 RAW 图,统计每个区域的平均值,写入 flash。

我个人更倾向于第二种。因为 sensor 寄存器读到的值往往是全局平均,精度不够。产线标定可以做到逐区域、逐通道的精细校正。

嗯,关于 BLC 的基础概念,就先聊到这儿。记住一句话:黑电平是 ISP 的基石,基石不稳,后面全是白搭。