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消除的典型流程:

  1. 采集N帧暗帧(N≥16,推荐32帧)
  2. 逐像素求平均,得到FPN模板
  3. 对每一帧raw图,逐像素减去FPN模板
  4. 如果温度变化大,需要做温度查表补偿

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没消干净,时域滤波会把条纹当成“稳定信号”保留下来

我建议的流水线顺序:

  1. 先做黑电平校正(包括FPN消除)
  2. 再做时域去噪(利用多帧信息)
  3. 最后做空域去噪(处理残余噪声)

这个顺序不能乱。我曾经试过先做空域去噪再做黑电平校正,结果黑电平校正把去噪后的低频成分又减掉了,图像出现奇怪的色偏。

黑电平校正与去噪流程 Raw图输入 黑电平校正 (含FPN消除) 时域去噪 (多帧/递归) 空域去噪 (双边/NLM) 干净图像输出 关键依赖 黑电平不准 → 噪声模型偏差 FPN残留 → 时域滤波保留条纹 顺序不可颠倒

2.6 实战中的常见坑

最后,分享几个我踩过的坑:

坑1:黑电平校正后出现负值

有些像素的黑电平比信号还大,减完变成负数。如果不做截断,后面去噪会出问题。我习惯在减完后做一次 clamp 到0。

坑2:时域滤波的α值固定

不同光照条件下,最优α值差别很大。暗光下需要强去噪(α小),亮光下需要低延迟(α大)。建议做光照自适应。

坑3:双边滤波的σ参数调不好

σ_space 一般取图像尺寸的1-2%,σ_range 取图像动态范围的5-10%。这个经验值在大部分场景下都适用。

嗯,黑电平校正和去噪这块,说难不难,说简单也不简单。关键是要理解每个环节的物理意义,以及它们之间的耦合关系。把这些基础打牢了,后面做神经网络融合才能事半功倍。