4. 黑电平校正(BLC)实战
黑电平校正,圈里人常叫BLC。说白了,就是让传感器在完全没光的时候,输出值正好是0。听起来简单吧?但实际做起来,坑不少。
我记得刚入行那会儿,有个项目画面暗部偏紫,怎么调都调不好。折腾了两天,最后发现是黑电平没校干净。从那以后,我对BLC就特别上心。
4.1 硬件BLC实现原理
硬件BLC,是传感器内部自己干的活。它不需要主芯片参与,速度快,延迟低。安防监控里,大部分Sensor都支持。
4.1.1 钳位电路
钳位电路,是硬件BLC的第一道防线。它的作用,是把像素信号的最低电平“钳”在一个参考电压上。
怎么理解呢?你想想看,像素输出的是电压信号。暗电流、温度漂移,都会让这个电压乱飘。钳位电路就像个稳压器,把乱飘的底给稳住。
具体实现上,钳位电路会采样这些遮光像素的输出,然后生成一个反馈电压,去抵消正常像素的偏移。这个过程是连续的,每帧都在做。
4.1.2 光学黑带(OB)
光学黑带,英文叫Optical Black,简称OB。这是传感器设计时就留好的“参考区”。
在传感器的像素阵列里,边缘会有几行或几列像素,被金属层完全遮住。这些像素接收不到光,它们的输出,就代表了当前条件下的黑电平。
| OB类型 | 位置 | 用途 |
|---|---|---|
| 水平OB | 像素阵列顶部/底部 | 校正行方向的黑电平漂移 |
| 垂直OB | 像素阵列左侧/右侧 | 校正列方向的黑电平漂移 |
| 内部OB | 像素阵列内部(间隔分布) | 校正局部温度梯度影响 |
硬件BLC会实时读取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 动态估算
动态估算,是实时从图像里算黑电平。它不依赖产线标定,能自适应温度、增益的变化。
常用的方法有两种:
- 直方图统计法: 统计整帧图像的直方图,找到最低的峰值,认为那就是黑电平。这个方法对暗部细节丰富的场景比较准。
- 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各自的位置。