4. 黑电平校正(BLC):从原理到实战

各位同学,今天我们来聊聊黑电平校正。这个话题,说简单也简单,说复杂也复杂。我在车载ISP领域摸爬滚打这么多年,黑电平校正这块踩过的坑,真能写个小本本。

先问大家一个问题:为什么明明镜头盖盖住了,传感器输出的却不是0,而是一堆非零值?这就是黑电平的由来。

4.1 黑电平产生原因

黑电平,说白了就是传感器在无光照情况下的暗电流输出。为什么会这样?

  • 传感器暗电流:硅基半导体在无光照时,热激发产生的电子-空穴对,会形成微弱电流。温度每升高10°C,暗电流大约翻一倍。我在夏天做车载摄像头测试时,黑电平漂移特别明显。
  • 读出电路噪声:像素阵列的读出电路本身有偏置电压,这部分也会叠加到信号上。
  • ADC偏移:模数转换器存在固定的偏移量,导致输出值整体上移。
  • 工艺差异:不同芯片、不同批次,黑电平值可能相差几十个DN(数字码值)。

关键认知:黑电平不是噪声,而是信号中的固定偏置。如果不校正,暗场景会发灰,亮场景的动态范围也会被压缩。

4.2 全局BLC算法

全局BLC,就是整帧图像减去同一个黑电平值。实现起来很简单:

// 全局黑电平校正伪代码
uint16_t blc_value = 64;  // 从OB行统计得到
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        pixel[y][x] = (pixel[y][x] > blc_value) ? 
                       (pixel[y][x] - blc_value) : 0;
    }
}

但这里有个坑——全局BLC只适用于均匀场景。车载摄像头经常面对强光、阴影交替的环境,全局校正就不够用了。

我曾经踩过的坑:某次在隧道出口场景,全局BLC导致图像上半部分偏暗、下半部分偏亮。后来才发现,是传感器不同区域的暗电流不一致造成的。

4.3 局部BLC算法

局部BLC,就是把图像分成多个区域,每个区域独立计算黑电平值。我建议用4x4或8x8的网格。

网格大小 优点 缺点
2x2 计算量小 校正精度不够
4x4 平衡性好 需要插值
8x8 精度高 存储开销大

局部BLC的流程是这样的:

  1. 将图像划分为MxN个网格
  2. 每个网格内统计OB像素(光学黑像素)的均值
  3. 对网格间的黑电平值做双线性插值
  4. 逐像素减去对应的插值结果

我的经验:4x4网格配合双线性插值,在车载场景下效果最好。网格太密反而会引入噪声,太粗又校正不干净。

4.4 动态黑电平跟踪

动态黑电平跟踪,说白了就是让黑电平值随着环境变化自动调整。车载场景下,温度变化剧烈,从-40°C到85°C,黑电平可能漂移几十个DN。

我常用的方法有两种:

  • OB行跟踪:传感器通常有几行被遮光的像素(光学黑行),实时统计这些行的均值作为黑电平参考。
  • 暗像素跟踪:在传感器阵列中预留一些被遮光的像素,分布在各个位置,实时监测。
// 动态黑电平跟踪(OB行方式)
uint16_t ob_rows[4];  // 4行OB像素
uint32_t sum = 0;
for (int r = 0; r < 4; r++) {
    for (int c = 0; c < width; c++) {
        sum += ob_rows[r][c];
    }
}
uint16_t current_blc = sum / (4 * width);

// 低通滤波,防止突变
static uint16_t filtered_blc = 0;
filtered_blc = (filtered_blc * 7 + current_blc) / 8;

注意:动态跟踪的更新频率不能太快。我建议每帧更新一次,但要做低通滤波。否则画面会出现闪烁,尤其在夜间场景。

4.5 硬件实现与软件补偿

硬件实现BLC,通常是在ISP流水线的早期阶段。我见过的主流方案有:

  • 减法器阵列:每个像素通道配置一个减法器,实时减去黑电平值。速度快,但面积大。
  • 查找表(LUT):将黑电平值存入LUT,根据像素位置查表校正。灵活,但需要额外存储。
  • 行缓存+减法:缓存一行数据,统计OB行后统一减去。性价比高,车载方案常用。

软件补偿,一般用在硬件不支持或者需要后处理的场景。比如:

// 软件补偿示例(带防溢出处理)
void blc_software_compensation(uint16_t *frame, int size, uint16_t blc) {
    for (int i = 0; i < size; i++) {
        if (frame[i] > blc) {
            frame[i] -= blc;
        } else {
            frame[i] = 0;  // 防止下溢
        }
    }
}

我的建议:硬件做粗校正,软件做精补偿。硬件负责实时性,软件负责灵活性。两者结合,效果最好。

4.6 知识体系总览

下面这张图,是我自己总结的黑电平校正知识体系。你想想看,从原因到算法,从硬件到软件,其实是一条完整的链路。

黑电平校正(BLC)知识体系 黑电平校正 产生原因 全局BLC算法 局部BLC算法 动态黑电平跟踪 暗电流 读出噪声 ADC偏移 工艺差异 整帧减固定值 实现简单 均匀场景适用 非均匀场景失效 网格划分 双线性插值 精度高 存储开销大 OB行跟踪 暗像素跟踪 低通滤波 防闪烁 硬件实现 + 软件补偿 = 最佳方案

嗯,黑电平校正就讲到这里。记住一句话:黑电平校正不是简单的减法,而是一个需要根据场景、温度、传感器特性动态调整的过程。车载环境复杂,千万别用死板的方法。


公众号:蓝海资料掘金营,微信deep3321