4. 黑电平校正(BLC)实战

黑电平校正,圈里人常叫BLC。说白了,就是让传感器在完全没光的时候,输出值正好是0。听起来简单吧?但实际做起来,坑不少。

我记得刚入行那会儿,有个项目画面暗部偏紫,怎么调都调不好。折腾了两天,最后发现是黑电平没校干净。从那以后,我对BLC就特别上心。

4.1 硬件BLC实现原理

硬件BLC,是传感器内部自己干的活。它不需要主芯片参与,速度快,延迟低。安防监控里,大部分Sensor都支持。

4.1.1 钳位电路

钳位电路,是硬件BLC的第一道防线。它的作用,是把像素信号的最低电平“钳”在一个参考电压上。

怎么理解呢?你想想看,像素输出的是电压信号。暗电流、温度漂移,都会让这个电压乱飘。钳位电路就像个稳压器,把乱飘的底给稳住。

我的经验: 钳位电路通常工作在像素阵列的“空白行”或“哑像素”上。这些像素被遮光,理论上输出应该是0。但实际会有偏移,钳位电路就负责把这个偏移拉回来。

具体实现上,钳位电路会采样这些遮光像素的输出,然后生成一个反馈电压,去抵消正常像素的偏移。这个过程是连续的,每帧都在做。

4.1.2 光学黑带(OB)

光学黑带,英文叫Optical Black,简称OB。这是传感器设计时就留好的“参考区”。

在传感器的像素阵列里,边缘会有几行或几列像素,被金属层完全遮住。这些像素接收不到光,它们的输出,就代表了当前条件下的黑电平。

OB类型 位置 用途
水平OB 像素阵列顶部/底部 校正行方向的黑电平漂移
垂直OB 像素阵列左侧/右侧 校正列方向的黑电平漂移
内部OB 像素阵列内部(间隔分布) 校正局部温度梯度影响

硬件BLC会实时读取OB区域的像素值,然后计算平均值,再用这个平均值去校正整个画面。这个过程是硬件自动完成的,不需要软件干预。

注意: OB区域的像素数量有限,统计噪声会比较大。如果OB区域有坏点,那影响就更大了。我曾经遇到过一个项目,画面一直有固定条纹,查了三天,最后发现是OB区域有个坏像素,导致黑电平估算偏了。

4.2 软件BLC实现原理

软件BLC,是在ISP处理链路里,用算法来校正黑电平。它比硬件BLC灵活,但需要消耗算力。

4.2.1 减去固定值

这是最简单的软件BLC方法。在产线标定时,测出传感器的黑电平偏移量,然后存成一个固定值。每次开机,直接从像素值里减去这个数。

// 减去固定值示例(C语言伪代码)
uint16_t pixel_value = get_pixel(row, col);
uint16_t black_level = 64;  // 产线标定值
uint16_t corrected = (pixel_value > black_level) ? (pixel_value - black_level) : 0;
set_pixel(row, col, corrected);

这个方法简单粗暴,但有个问题:黑电平会随温度、增益变化。固定值只能管一个点,温度一变,它就偏了。

适用场景: 成本敏感、温度变化小的室内监控场景。比如仓库、办公室,环境温度相对稳定,减去固定值够用了。

4.2.2 动态估算

动态估算,是实时从图像里算黑电平。它不依赖产线标定,能自适应温度、增益的变化。

常用的方法有两种:

  1. 直方图统计法: 统计整帧图像的直方图,找到最低的峰值,认为那就是黑电平。这个方法对暗部细节丰富的场景比较准。
  2. OB区域采样法: 在软件里模拟硬件OB的做法,从图像边缘的暗区采样,计算平均值。这个方法需要确保采样区域是真的暗区,不能有光。

我个人习惯用OB区域采样法。因为它更稳定,不容易被画面内容干扰。但要注意,采样区域要避开强光边缘,否则会把亮区的值当成黑电平。

// 动态估算示例(OB区域采样法)
uint32_t sum = 0;
uint16_t sample_count = 0;
for (int row = 0; row < OB_ROWS; row++) {
    for (int col = 0; col < IMG_WIDTH; col++) {
        sum += get_pixel(row, col);
        sample_count++;
    }
}
uint16_t estimated_black = sum / sample_count;

// 用估算值校正全图
for (int row = 0; row < IMG_HEIGHT; row++) {
    for (int col = 0; col < IMG_WIDTH; col++) {
        uint16_t pixel = get_pixel(row, col);
        uint16_t corrected = (pixel > estimated_black) ? (pixel - estimated_black) : 0;
        set_pixel(row, col, corrected);
    }
}
避坑指南: 动态估算不能每帧都大幅跳变。我曾经遇到过,画面亮度稳定,但黑电平每帧都在变,导致画面闪烁。后来加了时域滤波,用滑动平均来平滑估算值,问题才解决。

4.3 硬件BLC vs 软件BLC

两种方法各有优劣。我整理了一个对比表,方便你选型时参考。

对比项 硬件BLC 软件BLC
实现方式 传感器内部电路 ISP算法
延迟 低(像素级实时) 高(需要帧缓存)
灵活性 低(固定逻辑) 高(可调参数)
适应性 依赖OB区域 可自适应场景
算力消耗 无 有(约1-2% CPU)
典型场景 高端安防、车载 消费级IPC、USB摄像头

实际项目中,我建议两者结合。硬件BLC做粗调,把大范围的偏移校掉。软件BLC做细调,补偿温度、增益变化带来的残余偏移。这样既保证了实时性,又兼顾了精度。

4.4 BLC校正流程总览

下面这张图,展示了从传感器原始数据到校正后数据的完整流程。你可以看到硬件BLC和软件BLC各自的位置。

BLC校正流程总览 Sensor原始数据 硬件BLC(钳位+OB) 软件BLC(动态估算) 校正后数据 关键说明: 1. 硬件BLC在Sensor内部完成,输出数据已经过粗校正。 2. 软件BLC在ISP前端处理,对硬件BLC的残余偏移做精细补偿。 3. 两者配合使用,可以覆盖从-20°C到+70°C的宽温度范围。 4. 动态估算的采样区域,建议避开画面边缘5%的像素,防止镜头阴影干扰。