2. 黑电平校正与去噪:从暗电流到干净图像
黑电平校正和去噪,是ISP流水线里最基础、也最容易被忽视的两个环节。我刚开始做ISP的时候,总觉得黑电平嘛,不就是减个固定值?后来发现,事情远没那么简单。
说白了,黑电平校正解决的是传感器本身的“底噪”问题。而去噪,则是跟光子随机性做斗争。这两个环节做不好,后面再牛的算法也救不回来。
2.1 黑电平校正原理
传感器在没有光照的情况下,理论上应该输出0。但实际呢?由于暗电流的存在,像素会读出一些非零值。这个值就是黑电平。
我见过不少新手,直接把黑电平当成一个全局常数来减。嗯,这里要注意——不同像素的黑电平其实是不一样的。
核心公式:
I_corrected = I_raw - B(x, y)
其中 B(x, y) 是每个像素位置的黑电平值,不是全局常数。
为什么黑电平会随位置变化?原因主要有三个:
- 暗电流不均匀:硅片掺杂浓度、温度梯度都会导致暗电流差异
- 读出电路偏移:列放大器、ADC的偏置电压不一致
- 温度影响:温度每升高6-8°C,暗电流翻倍
我在项目中遇到过最极端的情况——某款传感器在60°C环境下,黑电平偏移量比常温时大了3倍。如果不做温度补偿,整张图直接偏绿。
2.2 固定模式噪声消除
固定模式噪声(FPN),说白了就是每次拍出来的位置都一样的噪声。它不像随机噪声那样会变,而是“固定”在传感器结构上。
FPN主要分两类:
| 类型 | 来源 | 特征 | 消除方法 |
|---|---|---|---|
| 列FPN | 列放大器增益差异 | 竖条纹 | 列校正系数 |
| 像素FPN | 像素本身暗电流差异 | 固定亮点/暗点 | 暗帧减除 |
我个人的习惯是,在产线标定阶段就采集多帧暗帧,然后做平均。这样能拿到比较干净的FPN模板。
实战技巧:暗帧采集时,曝光时间要和实际使用一致。我曾经因为偷懒,用短曝光暗帧去校正长曝光图像,结果校正后反而引入了新的条纹。
FPN消除的典型流程:
- 采集N帧暗帧(N≥16,推荐32帧)
- 逐像素求平均,得到FPN模板
- 对每一帧raw图,逐像素减去FPN模板
- 如果温度变化大,需要做温度查表补偿
2.3 时域去噪基础
时域去噪,就是利用多帧信息来降噪。你想想看,随机噪声在帧与帧之间是不相关的,但真实信号是相关的。那多帧平均一下,噪声不就消掉了?
原理很简单:
I_denoised = (1/N) * Σ I_i
N帧平均,噪声标准差降低到原来的 1/√N。4帧平均,噪声减半;16帧平均,噪声减到1/4。
但这里有个坑——运动物体怎么办?
注意:直接多帧平均会导致运动拖影。我见过有人用32帧平均去拍夜景,结果行人变成了“鬼影”。
解决办法是运动自适应时域滤波:
- 帧间差异检测:计算当前帧与参考帧的像素差异
- 运动权重调整:差异大的区域,降低时域滤波强度
- 递归滤波:用IIR结构,只保留部分历史信息
我个人比较喜欢用指数移动平均(EMA):
I_out(t) = α * I_in(t) + (1-α) * I_out(t-1)
α值越小,去噪越强,但运动拖尾也越严重。α值一般取0.1-0.3之间,具体看场景。
2.4 空域去噪基础
空域去噪,就是在一帧图像内部做降噪。它不依赖多帧信息,所以对运动场景很友好。
最经典的空域去噪方法:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 高斯滤波 | 加权平均邻域像素 | 简单快速 | 边缘模糊 |
| 中值滤波 | 取邻域中值 | 抗椒盐噪声好 | 细节丢失 |
| 双边滤波 | 空间+灰度权重 | 保边去噪 | 计算量大 |
| NLM | 非局部块匹配 | 去噪效果最好 | 极慢 |
在ISP芯片上部署时,我建议优先考虑双边滤波。为什么?因为它能在去噪的同时保留边缘,而且有成熟的硬件加速方案。
双边滤波的公式:
I_out(p) = (1/W_p) * Σ G_s(||p-q||) * G_r(|I(p)-I(q)|) * I(q)
其中 G_s 是空间权重,G_r 是灰度权重。空间权重让远处的像素贡献小,灰度权重让灰度差异大的像素贡献小——这样边缘就不会被模糊掉。
部署经验:在AI芯片上实现双边滤波时,可以把空间权重做成查表,灰度权重用高斯近似。这样能省掉大量浮点运算。我在某款NPU上做过,速度提升了4倍。
2.5 黑电平与去噪的联动
这里有个容易被忽略的点——黑电平校正做不好,去噪效果会大打折扣。
为什么?因为黑电平偏移会导致噪声模型不准。举个例子:
- 如果黑电平偏大,暗区的噪声会被放大
- 如果黑电平偏小,亮区的信噪比会被低估
- FPN没消干净,时域滤波会把条纹当成“稳定信号”保留下来
我建议的流水线顺序:
- 先做黑电平校正(包括FPN消除)
- 再做时域去噪(利用多帧信息)
- 最后做空域去噪(处理残余噪声)
这个顺序不能乱。我曾经试过先做空域去噪再做黑电平校正,结果黑电平校正把去噪后的低频成分又减掉了,图像出现奇怪的色偏。
2.6 实战中的常见坑
最后,分享几个我踩过的坑:
坑1:黑电平校正后出现负值
有些像素的黑电平比信号还大,减完变成负数。如果不做截断,后面去噪会出问题。我习惯在减完后做一次 clamp 到0。
坑2:时域滤波的α值固定
不同光照条件下,最优α值差别很大。暗光下需要强去噪(α小),亮光下需要低延迟(α大)。建议做光照自适应。
坑3:双边滤波的σ参数调不好
σ_space 一般取图像尺寸的1-2%,σ_range 取图像动态范围的5-10%。这个经验值在大部分场景下都适用。
嗯,黑电平校正和去噪这块,说难不难,说简单也不简单。关键是要理解每个环节的物理意义,以及它们之间的耦合关系。把这些基础打牢了,后面做神经网络融合才能事半功倍。