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 知识结构图
下面这张图,把温度、增益、多帧平均的关系串起来了。你可以把它当作本章的“地图”。
4.5 工程实践建议
最后,给几个我在项目中沉淀下来的建议:
| 场景 | 推荐做法 | 注意事项 |
|---|---|---|
| 温度变化剧烈 | 实时OB + 温度查表双备份 | OB失效时切到查表 |
| 增益频繁切换 | 增益补偿系数实时计算 | 注意模拟/数字增益分开处理 |
| 低光照高增益 | 多帧平均 + 坏点剔除 | alpha值适当调小 |
| 资源受限平台 | 指数移动平均(EMA) | 只保存一个状态变量 |
再次提醒:黑电平校正不是一劳永逸的。温度、增益、噪声,这三个因素必须动态处理。否则,你的图像质量永远上不去。
好了,这一章的内容就到这里。记住:黑电平校正的进阶,就是跟温度和增益赛跑,用多帧平均稳住阵脚。