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 调试步骤
- 采集暗场数据:每个增益/曝光组合,拍10帧取平均,减少随机噪声。
- 统计各通道均值:用工具(比如Imatest或自己写的脚本)算出R、Gr、Gb、B四个通道的平均值。
- 建立查找表:把不同增益下的黑电平值做成LUT。我一般用线性插值,简单够用。
- 验证:换几个不同温度(比如25°C、45°C),看看校正后暗场是否接近0。
避坑指南:我曾经在调试一款安防摄像头时,发现暗场校正后反而出现了竖条纹。查了两天才发现,是OB行数据被DMA传输时丢了几个像素,导致黑电平计算错误。后来加了校验机制才解决。
4.3.3 常见问题与对策
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 暗场偏红/偏蓝 | 各通道黑电平不一致 | 分通道独立校正 |
| 暗场有横纹 | OB行受电源噪声干扰 | 增加OB行滤波,或改用暗场校准 |
| 亮度变化时黑电平漂移 | 增益/曝光补偿未联动 | 建立增益-黑电平LUT |
| 校正后图像偏暗 | 黑电平减多了 | 检查OB行是否包含有效像素 |
4.4 总结
黑电平校正,说白了就是给图像“归零”。
你想想看,如果连零都定不准,后面的白平衡、Gamma校正全是白搭。我见过不少团队,花大把时间调AWB和CCM,结果暗场一测,黑电平偏了10个DN,所有努力全白费。
所以我的建议是:先搞定BLC,再谈其他。这是ISP调试的基石,马虎不得。
最后送大家一句话:黑电平调好了,图像质量就稳了一半。剩下的,都是锦上添花。