3、黑电平校正(BLC):黑电平产生原因、BLC算法原理、BLC参数调试方法
3.1 黑电平是怎么来的?—— 一个让我头疼过的问题
刚入行那会儿,我拿到一颗新 sensor,第一件事就是看 raw 图。结果发现,明明把镜头盖得严严实实,拍出来的像素值却不是 0。我当时就懵了——这 sensor 是不是坏了?
后来才明白,这不是坏,是正常现象。这个非零的底值,就是我们说的黑电平(Black Level)。
黑电平产生的原因,说白了有这几个:
- 暗电流:光电二极管在没有光照时,热激发也会产生少量电子。温度越高,暗电流越大。我在夏天做户外测试时,黑电平能比冬天高出十几个 DN。
- 读出电路偏置:ADC 和模拟前端电路本身有固定的偏置电压。这个偏置会叠加到像素信号上。
- 像素结构差异:不同像素设计(比如 4T、3T 结构)的复位电平不同,导致黑电平基准不一样。
关键认知:黑电平不是噪声,它是一个固定的直流偏置。如果不校正,整个图像的亮度会被抬高,暗部细节全被淹没。
3.2 BLC 算法原理 —— 我常用的两种方法
黑电平校正,就是把这个底值减掉。但怎么减、减多少,这里面有讲究。
我个人习惯把 BLC 算法分成两类:
3.2.1 全局固定校正
最简单粗暴的方法。从 sensor 的 datasheet 里查到一个典型值,比如 64(10-bit raw),然后全图减去这个值。
// 伪代码示例:全局固定 BLC
for each pixel in raw_image:
pixel = pixel - blc_offset
if pixel < 0:
pixel = 0
这个方法快,但精度差。为什么?因为黑电平会随温度、增益变化。你想想看,同一个 sensor,在 0°C 和 60°C 下,黑电平能差 20 个 DN。用一个固定值去减,肯定不准。
3.2.2 动态自适应校正
这是我更推荐的方法。sensor 通常会在像素阵列的边缘留一些光学黑像素(Optical Black, OB),这些像素被金属遮挡,不受光照,只反映暗电流和偏置。
算法流程是这样的:
- 采集 OB 区域的像素值,计算均值或中位数。
- 用这个值作为当前帧的黑电平估计。
- 逐像素减去该值。
// 伪代码示例:动态 BLC
ob_mean = calculate_mean(ob_region) // 计算 OB 区域均值
for each pixel in raw_image:
pixel = pixel - ob_mean
if pixel < 0:
pixel = 0
我的经验:OB 区域不要取单行,最好取多行平均。我曾经遇到过一个 sensor,OB 行有固定的行噪声,单行取值会导致校正后的图像出现条纹。取 4-8 行平均,能有效抑制这种噪声。
3.3 BLC 参数调试方法 —— 避坑指南
调试 BLC 参数,说难不难,说简单也不简单。我踩过的坑,今天全告诉你。
3.3.1 调试前的准备
你需要准备:
- 一台可调温的暗箱(或者至少能控制环境温度)
- 不同增益下的 raw 图(ISO 100、200、400、800、1600)
- 不同曝光时间下的 raw 图(1ms、10ms、100ms)
3.3.2 参数调试步骤
我一般按这个顺序来:
- 测 OB 值:盖上镜头盖,在不同增益和曝光时间下采集 raw 图,提取 OB 区域的均值。
- 建立查找表:把增益、曝光时间和 OB 值的关系做成 LUT。比如:
| 增益 (dB) | 曝光时间 (ms) | OB 均值 (DN) |
|---|---|---|
| 0 | 10 | 64 |
| 6 | 10 | 72 |
| 12 | 10 | 88 |
| 0 | 100 | 70 |
- 验证校正效果:用校正后的 raw 图,检查暗部是否还有偏色。我习惯看 R、G、B 三个通道的 OB 区域均值是否一致。
我曾经犯过的错:有一次我调试一个 12-bit sensor,BLC 参数设对了,但发现图像暗部偏绿。查了半天,原来是 OB 区域只用了绿色通道的值,没考虑 R、B 通道的差异。记住:每个通道的黑电平可能不同,要分别校正!
3.4 BLC 在 ISP 流水线中的位置
BLC 是 ISP 流水线的第一关。它后面跟着去噪、去坏点、白平衡等模块。如果 BLC 没做好,后面的模块全白搭。
下面这张图是我自己画的 ISP 流水线框架,BLC 的位置一目了然:
3.5 调试中的常见问题与对策
调试 BLC 时,你可能会遇到这些问题:
- 暗部偏色:R、G、B 通道的黑电平不一致。对策:分别统计各通道的 OB 值,分别校正。
- 图像闪烁:帧与帧之间的 OB 值波动太大。对策:对 OB 值做时间域滤波,比如用 IIR 滤波器。
- 暗部细节丢失:减得太多,把有效信号也减掉了。对策:检查 OB 区域是否被污染(比如漏光),或者改用中位数代替均值。
一个小技巧:调试时,我习惯在暗箱里放一个均匀光源的灰卡。这样既能验证 BLC 效果,又能顺便检查暗部均匀性。一举两得。
3.6 总结
黑电平校正,说白了就是给图像「清零」。它不复杂,但容易出错。我见过不少工程师,花大量时间调白平衡、调去噪,结果图像暗部一直偏色,最后发现是 BLC 没做好。
记住三点:
- 黑电平不是固定的,它随温度和增益变化
- 动态校正优于固定校正
- 每个通道要分别处理
做到这三点,BLC 这块基本不会出大问题。