2、黑电平校正:黑电平产生原理、校正算法实现、参数调试技巧

2.1 黑电平到底是什么?

黑电平,说白了就是传感器在「完全没光」的情况下,输出的信号值。

你想想看,一个理想的图像传感器,没光的时候应该输出0。但现实不是这样的。传感器本身有暗电流,读出电路有偏置,ADC也有偏移量。这些因素加起来,导致没光的时候,像素也会输出一个非零值。

我个人习惯把这个值叫做「底噪基线」。它不是一个固定的数字,而是会随着温度、增益、曝光时间变化的。

核心理解:黑电平校正的目的,就是把这张「底噪基线」从原始图像中减掉,让黑色真正变黑。

我在项目中遇到过一台手机,暗光下拍出来的照片偏紫。查了半天,发现是黑电平没校正好,R通道的底噪比B通道高了几个DN。减掉之后,颜色就正常了。

2.2 黑电平产生的物理机制

黑电平的来源主要有三个:

  • 暗电流:硅基材料的热激发产生的电子。温度每升高6-8度,暗电流翻一倍。这就是为什么手机拍夜景,时间长了画面会发红。
  • 读出电路偏置:为了确保ADC能正常工作,传感器厂商会在信号上叠加一个固定的偏置电压。这个值通常在几十到几百个DN之间。
  • 像素复位噪声:每次复位后,像素的电压不完全一致,会有一个随机波动。这个波动在空间上表现为固定模式噪声(FPN)。

嗯,这里要注意:黑电平校正只能消除固定偏置部分,随机噪声是消不掉的。那是降噪模块的事。

2.3 黑电平校正算法实现

最简单的校正方式就是减法:

// 伪代码:黑电平校正
for each pixel (x, y) {
    pixel_out[x][y] = pixel_raw[x][y] - black_level;
    if (pixel_out[x][y] < 0) {
        pixel_out[x][y] = 0;  // 防止下溢
    }
}

但实际工程中,黑电平不是一个全局常数。它跟位置有关,跟增益有关,跟温度有关。

2.3.1 逐行黑电平校正

很多CMOS传感器会在每行像素的末尾,放置一些被遮挡的像素(光学黑像素,简称OB)。这些像素收不到光,它们的输出值就是当前行的黑电平参考。

算法流程:

  1. 读取每行的OB像素值,计算均值或中位数。
  2. 用这个值减去该行的有效像素。
  3. 如果OB像素数量少(比如只有4个),建议用中位数,避免单个坏点干扰。

我的调试技巧:OB像素的均值不要直接用。我习惯先剔除掉异常值(比如超过均值3倍标准差的点),再计算。否则一个坏OB像素,能毁掉一整行图像。

2.3.2 增益相关的黑电平校正

当模拟增益改变时,黑电平也会跟着变。因为增益放大了信号,也放大了底噪。

校正公式:

// 增益相关的黑电平校正
black_level_gain = black_level_base * analog_gain + black_level_offset;

for each pixel (x, y) {
    pixel_out[x][y] = pixel_raw[x][y] - black_level_gain;
}

这里的 black_level_baseblack_level_offset 需要标定。我一般会在实验室里,用不同增益拍全黑图,然后拟合出一条直线。

2.3.3 温度补偿

温度对黑电平的影响很大。我曾经在夏天做户外测试,中午和晚上的黑电平差了十几个DN。

解决方案:

  • 在传感器附近放一个温度传感器。
  • 建立温度-黑电平的查找表(LUT)。
  • 运行时根据当前温度,查表得到补偿值。

警告:温度补偿的LUT一定要在传感器稳定工作后标定。刚开机时传感器温度在上升,这时候标定的数据不准。我建议开机后等5分钟再开始采集标定数据。

2.4 参数调试技巧

2.4.1 如何判断黑电平是否准确?

最简单的方法:拍一张全黑图(盖上镜头盖),然后看直方图。

  • 如果直方图峰值在0附近,说明黑电平校正到位。
  • 如果峰值偏左(负数被截断),说明减多了,画面会丢失暗部细节。
  • 如果峰值偏右(大于0),说明没减够,黑色会发灰。

我个人习惯看R、G、B三个通道的直方图。如果三个通道的峰值位置不一致,说明黑电平没对齐,会导致偏色。

2.4.2 暗角与黑电平的关系

你可能会发现,校正完黑电平后,画面四周比中间暗。这不是黑电平的问题,是镜头暗角。

但黑电平校正做不好,会加重暗角。因为四周的亮度本来就低,如果黑电平减多了,四周直接变成0,暗角就更明显了。

避坑指南:我曾经在一个项目里,把黑电平调得特别准,结果暗角测试没过。后来发现,黑电平校正和暗角校正(LSC)要配合着调。先粗调黑电平,再做LSC标定,最后微调黑电平。顺序不能乱。

2.4.3 不同增益下的黑电平标定

标定流程:

  1. 设置传感器为最低增益(通常是0dB)。
  2. 拍全黑图,计算OB像素均值,记为BL0。
  3. 增加增益到1x(比如6dB),拍全黑图,计算BL1。
  4. 继续增加增益,记录BL2、BL3...
  5. 用线性回归拟合 BL = a * gain + b。

我一般会测5-7个增益点,覆盖从最低到最高增益。拟合的R²值要大于0.99,否则说明传感器线性度有问题,需要排查。

2.4.4 黑电平校正的精度要求

应用场景 精度要求 说明
普通拍照 ±2 DN 人眼对暗部偏差不敏感
视频监控 ±1 DN 长时间曝光,偏差会累积
医疗/工业 ±0.5 DN 需要精确的灰度测量
科学成像 ±0.1 DN 需要做多帧平均和温度补偿

2.5 常见问题与排查

问题1:画面有竖条纹

大概率是OB像素的列噪声没处理好。检查一下OB像素的读出顺序,是不是跟有效像素对齐了。

问题2:暗光下偏色

三个通道的黑电平不一致。用全黑图分别看R、G、B的直方图,单独调整每个通道的黑电平。

问题3:画面有黑斑

可能是传感器表面的灰尘,也可能是OB像素区域有脏污。先清洁传感器,如果问题还在,检查OB像素的屏蔽层是否完好。

总结一下:黑电平校正看似简单,就是做个减法。但要做好,需要理解传感器的物理特性,需要精确的标定流程,还需要跟其他模块(LSC、AWB、降噪)配合。我做了这么多年ISP,每次遇到暗部画质问题,第一反应就是去查黑电平。这个基础打好了,后面的调试会顺利很多。