4、黑电平校正进阶:温度与增益的暗流

黑电平校正,听起来是个基础活。但真到了工程落地,你会发现它远不止减一个固定值那么简单。

为什么?因为黑电平本身会漂。温度一变,它漂。增益一变,它也漂。如果不把这些因素考虑进去,你辛辛苦苦调好的图像,换个环境就偏色了。

这一章,我们就来聊聊这些“暗流”。

4.1 温度对黑电平的影响

先说说温度。CMOS传感器里的暗电流,说白了就是热噪声。温度越高,电子越活跃,暗电流就越大。

黑电平的漂移,跟温度基本是线性关系。我见过一个项目,传感器从25°C升到60°C,黑电平硬生生漂了8个DN(12bit数据)。如果不补偿,暗部直接发红。

关键结论:黑电平随温度升高而增大,近似线性关系。斜率取决于传感器工艺和像素设计。

怎么补偿?一般有两种做法:

  • 查表法:提前标定不同温度下的黑电平值,运行时根据温度传感器读数查表。
  • 实时OB法:利用传感器周边的光学黑像素(OB,Optical Black),实时计算当前帧的黑电平。

我个人更倾向于实时OB法。查表法需要提前标定,而且标定数据会随着传感器老化而失效。OB像素是实时采样的,更靠谱。

小技巧:OB像素通常分布在传感器边缘,数量有限。建议取多行多列的平均值,别只取一行,万一那行有坏点呢?

4.2 增益对黑电平的影响

增益的影响,很多人会忽略。你想想看,模拟增益放大的是整个信号,包括黑电平。所以增益一变,黑电平也跟着变。

具体来说:

  • 模拟增益:直接放大OB区域的电压值,黑电平会成比例增大。
  • 数字增益:在ADC之后乘一个系数,黑电平也会被放大。

我曾经踩过一个坑:某个项目在低光照下开了高增益,结果黑电平校正没跟上,暗部出现了明显的色偏。查了半天,才发现是增益补偿没做。

避坑指南:增益变化时,黑电平校正值必须同步更新。否则,增益越高,偏色越严重。

校正公式其实很简单:

// 增益补偿后的黑电平
black_level_compensated = black_level_base * gain

// 实际校正
pixel_corrected = pixel_raw - black_level_compensated

嗯,这里要注意:gain是当前帧的模拟增益倍数。如果同时有模拟和数字增益,需要分别处理。

4.3 多帧平均法降噪

黑电平校正还有一个头疼的问题:噪声。OB像素本身也有噪声,直接用它算黑电平,结果会抖动。帧与帧之间的黑电平不一致,图像就会闪烁。

怎么解决?多帧平均法。

说白了,就是把连续几帧的OB值做个平均,再用这个平均值去校正。这样能有效抑制随机噪声。

我一般用指数移动平均(EMA),比简单平均更省内存:

// 指数移动平均
ema_black = alpha * current_ob_mean + (1 - alpha) * ema_black_prev

// alpha 通常取 0.1 ~ 0.3

alpha越小,平滑效果越强,但响应越慢。你需要根据帧率和场景变化速度来调。

经验值:30fps的视频流,alpha取0.2左右,既能抑制闪烁,又能跟上温度变化。

多帧平均的另一个好处是:可以顺便检测OB像素中的坏点。如果某个OB像素的值长期偏离均值,直接把它剔除,不参与平均。

4.4 知识结构图

下面这张图,把温度、增益、多帧平均的关系串起来了。你可以把它当作本章的“地图”。

黑电平校正进阶:核心逻辑 温度变化 增益变化 OB像素采样 影响 放大 输入 黑电平漂移(需补偿) 多帧平均降噪 提供稳定OB 黑电平校正:pixel - (OB_mean × gain) 稳定、无偏色的图像 温度+增益+降噪 三者缺一不可

4.5 工程实践建议

最后,给几个我在项目中沉淀下来的建议:

场景 推荐做法 注意事项
温度变化剧烈 实时OB + 温度查表双备份 OB失效时切到查表
增益频繁切换 增益补偿系数实时计算 注意模拟/数字增益分开处理
低光照高增益 多帧平均 + 坏点剔除 alpha值适当调小
资源受限平台 指数移动平均(EMA) 只保存一个状态变量

再次提醒:黑电平校正不是一劳永逸的。温度、增益、噪声,这三个因素必须动态处理。否则,你的图像质量永远上不去。

好了,这一章的内容就到这里。记住:黑电平校正的进阶,就是跟温度和增益赛跑,用多帧平均稳住阵脚。