4、黑电平校正(BLC):黑电平产生原因、BLC算法原理、BLC参数调试实战

各位同学,咱们今天聊聊黑电平校正。英文叫Black Level Correction,简称BLC。

这玩意儿,说白了就是让相机在完全没光的时候,输出值应该是0。但现实世界哪有那么完美?传感器在暗处总会有点“底噪”,导致输出不为0。这个不为0的底数,就是黑电平。

4.1 黑电平是怎么来的?

我刚开始接触ISP时,也纳闷过:为什么传感器在全黑环境下拍出来的图不是纯黑的?后来拆了几颗Sensor才搞明白。

黑电平产生的原因,主要有这么几个:

  • 传感器暗电流:光电二极管在没光时,也会有微弱的电流泄漏。温度越高,暗电流越大。我在夏天调试户外摄像头时,黑电平漂移特别明显。
  • ADC偏移:模数转换器本身有个固定的偏置电压。不同通道的ADC,偏移量还不一样。
  • 电路噪声:电源纹波、时钟抖动,都会在暗场引入一个直流分量。

核心结论:黑电平不是固定的,它会随温度、增益、曝光时间变化。所以BLC必须动态调整,不能写死一个值。

4.2 BLC算法原理

算法其实不复杂。我给大家拆解一下。

4.2.1 基本公式

校正后的像素值 = 原始像素值 - 黑电平值

就这么简单?嗯,原理上确实就这一步。但难点在于:黑电平值怎么取?

4.2.2 黑电平的获取方式

行业内主流做法有两种:

方式 原理 优缺点
OB(Optical Black)行 传感器边缘有被遮挡的像素,专门用来测黑电平 实时性好,但OB区域有限,容易受噪声影响
暗场校准 盖上镜头盖,拍一张全黑图,统计平均值 精度高,但需要定期重做,温度变了就不准

我个人习惯用OB行做实时校正,再配合暗场校准做长期漂移补偿。两者结合,效果最稳。

4.2.3 算法流程

我画个伪代码,大家感受一下:

// 黑电平校正伪代码
// 输入:raw图像数据,OB行数据
// 输出:校正后的图像

// 步骤1:从OB行提取黑电平值
for each OB_row in sensor_data:
    black_level = average(OB_row_pixels)

// 步骤2:去除异常点(比如坏点)
black_level = median_filter(black_level)

// 步骤3:分通道处理(R/Gr/Gb/B通道黑电平不同)
black_level_R = black_level * gain_R
black_level_G = black_level * gain_G
black_level_B = black_level * gain_B

// 步骤4:逐像素校正
for each pixel in raw_image:
    if pixel.channel == 'R':
        pixel_out = pixel_in - black_level_R
    else if pixel.channel == 'G':
        pixel_out = pixel_in - black_level_G
    else:
        pixel_out = pixel_in - black_level_B

// 步骤5:钳位到有效范围
pixel_out = clamp(pixel_out, 0, 1023)  // 10bit为例

小技巧:分通道处理很重要。我遇到过一台设备,R通道黑电平比B通道高了8个DN,如果不分开校正,拍出来的画面偏紫。

4.3 BLC参数调试实战

理论讲完了,咱们来点干货。怎么调?

4.3.1 调试前的准备

  • 把镜头盖盖严实,确保绝对无光
  • 设置目标增益(比如0dB、6dB、12dB)
  • 设置目标曝光时间(比如1ms、10ms、100ms)

为什么要设多组?因为黑电平随增益和曝光时间变化。你只调一组,换场景就翻车。

4.3.2 调试步骤

  1. 采集暗场数据:每个增益/曝光组合,拍10帧取平均,减少随机噪声。
  2. 统计各通道均值:用工具(比如Imatest或自己写的脚本)算出R、Gr、Gb、B四个通道的平均值。
  3. 建立查找表:把不同增益下的黑电平值做成LUT。我一般用线性插值,简单够用。
  4. 验证:换几个不同温度(比如25°C、45°C),看看校正后暗场是否接近0。

避坑指南:我曾经在调试一款安防摄像头时,发现暗场校正后反而出现了竖条纹。查了两天才发现,是OB行数据被DMA传输时丢了几个像素,导致黑电平计算错误。后来加了校验机制才解决。

4.3.3 常见问题与对策

现象 可能原因 解决办法
暗场偏红/偏蓝 各通道黑电平不一致 分通道独立校正
暗场有横纹 OB行受电源噪声干扰 增加OB行滤波,或改用暗场校准
亮度变化时黑电平漂移 增益/曝光补偿未联动 建立增益-黑电平LUT
校正后图像偏暗 黑电平减多了 检查OB行是否包含有效像素

4.4 总结

黑电平校正,说白了就是给图像“归零”。

你想想看,如果连零都定不准,后面的白平衡、Gamma校正全是白搭。我见过不少团队,花大把时间调AWB和CCM,结果暗场一测,黑电平偏了10个DN,所有努力全白费。

所以我的建议是:先搞定BLC,再谈其他。这是ISP调试的基石,马虎不得。

最后送大家一句话:黑电平调好了,图像质量就稳了一半。剩下的,都是锦上添花。