4. 黑电平校准(BLC)
黑电平校准,圈里人常叫 BLC(Black Level Calibration)。
说白了,就是告诉相机:「什么才是真正的黑色」。
我刚开始接触 ISP 时,觉得这步很简单——不就是减个固定值嘛。直到有一次在暗光产线上,产品出现大面积偏色,我才意识到:BLC 没做好,后面整条 ISP 管线都是白搭。
4.1 BLC 到底在干什么?
先看一个现象:你把镜头盖死,理论上像素值应该是 0。但实际读出来的,往往是 16、32 甚至 64 这样的数值。
这些「不该有的底数」,就是黑电平。
黑电平的来源主要有三个:
- Sensor 暗电流: 半导体本身的热噪声,温度越高越明显。夏天产线比冬天容易飘,就是这个原因。
- ADC 偏移: 模数转换器不是理想器件,会有固定的直流偏置。
- 模拟增益引入: 增益一拉,噪声也跟着放大,黑电平整体上移。
如果不做 BLC,暗部会发灰、发雾,而且颜色会偏——因为 RGB 三个通道的黑电平往往不一样。
BLC 的核心目标就两个:
- 把「纯黑」像素校准到 0 附近。
- 保证暗区的信噪比不恶化。
嗯,这里要注意:不是减得越干净越好。减过头了,暗部细节会被切掉,出现「死黑」。
4.2 全局 BLC:简单但够用
全局 BLC,就是对整幅图像减去同一个值。
计算公式:
P_out = max(P_in - BLC_offset, 0)
这个 BLC_offset 怎么来?我习惯的做法是:
- 盖上镜头盖,采集 100 帧暗场图像。
- 对每帧取平均,再对 100 帧取平均。
- 分别统计 R、Gr、Gb、B 四个通道的均值。
- 取这些均值的整数部分作为 offset。
我的经验: 工业相机通常用 10bit 或 12bit RAW 数据。10bit 下,BLC_offset 一般在 16~64 之间。如果超过 100,建议先检查 sensor 配置或硬件设计。
全局 BLC 的优点是计算量小、硬件实现简单。缺点是——它假设整个 sensor 的暗电流是均匀的。
但现实不是这样。
4.3 局部 BLC:应对不均匀的暗电流
我在项目中遇到过一款 CMOS sensor,左上角比右下角暗电流高了 15 个 DN。用全局 BLC,左上角校正后偏紫,右下角偏绿。这就是典型的「暗电流不均匀」。
局部 BLC 的思路是:把图像分成 M×N 个网格,每个网格独立计算 offset。
实现流程:
- 采集暗场图像,分块统计每个网格的均值。
- 生成一张 offset 矩阵(M×N)。
- 对当前帧,根据像素坐标插值出对应的 offset 值。
- 逐像素减去插值后的 offset。
插值方式我推荐双线性插值,效果和性能比较均衡。如果你用 FPGA 实现,可以用最近邻插值——省资源,但网格边界会有跳变。
注意: 局部 BLC 的网格数量不是越多越好。网格太密,会把 sensor 的固定噪声也当成暗电流校正掉,反而引入新的条纹。我一般控制在 8×6 到 16×12 之间。
4.4 工业场景下的 BLC 调优技巧
工业相机和手机相机不一样。工业场景对一致性、稳定性要求极高。下面是我总结的几个实战技巧。
4.4.1 温度补偿:BLC 的「天敌」是温度
暗电流随温度指数增长。我测过一组数据:
| 温度(°C) | 暗电流均值(DN) | 偏移量变化 |
|---|---|---|
| 25 | 24 | 基准 |
| 45 | 38 | +14 |
| 65 | 67 | +43 |
如果不做温度补偿,相机开机 10 分钟和开机 1 小时的图像质量完全不同。
我的做法:
- 在 sensor 附近贴一个温度传感器。
- 标定 3~5 个温度点的 BLC offset。
- 运行时根据实时温度线性插值。
4.4.2 增益联动:BLC 不是静态的
模拟增益一变,黑电平也跟着变。我见过有人只标定了一组 BLC 参数,结果增益从 1x 调到 4x 时,暗部直接偏色。
建议: 在产线标定时,至少覆盖 1x、2x、4x、8x 四个增益点。每个增益点单独标定 BLC offset。
4.4.3 暗场更新策略
有些场景不允许你频繁盖镜头盖。比如在线检测设备,一盖盖子就停产。
我推荐两种方案:
- 定时更新: 每天开机后自动采集一次暗场,存入非易失存储器。
- 动态检测: 检测到画面整体亮度低于某个阈值(比如 1% 像素值),自动触发暗场采集。
避坑指南: 我曾经在一条产线上发现,BLC 参数每周都在缓慢漂移。排查了三天,最后发现是 sensor 的散热风扇积灰了。定期清洁散热系统,比调算法更管用。
4.5 BLC 在 ISP 管线中的位置
下面这张图展示了 BLC 在整个 ISP 管线中的位置和它与其他模块的关系。
4.6 调优检查清单
每次做完 BLC 调优,我都会过一遍这个清单:
- 暗场均值: 校正后 R/Gr/Gb/B 四个通道的均值是否接近 0?偏差是否在 ±2 DN 以内?
- 暗场均匀性: 四角与中心的差值是否小于 3 DN?
- 温度稳定性: 从 25°C 升温到 65°C,暗场均值漂移是否在可控范围?
- 增益一致性: 1x 到 8x 增益下,暗部是否出现偏色?
- 死黑检查: 暗部细节是否被切掉?直方图在 0 附近是否有堆积?
最后提醒一句: BLC 不是「一次标定,终身使用」的参数。Sensor 会老化,镜头会污染,环境会变化。我建议每季度重新标定一次,或者在固件中预留在线校准接口。