暗电流与固定模式噪声:从物理根源到校准实战

做图像传感器这些年,我花在暗电流和固定模式噪声上的时间,比任何其他模块都多。你想想看,一个传感器在完全无光的环境下,居然还能读出信号——这本身就是个让人头疼的事。更麻烦的是,每个像素的“漏电”程度还不一样,拍出来的画面就像一块脏玻璃。

这一节,我们就来拆解这两个问题。我会从物理机制讲起,再给出我实际项目中验证过的校准方法。

暗电流是怎么来的?

暗电流,说白了就是像素在没有光照时产生的电荷。它不是凭空冒出来的,根源在半导体物理里。

硅材料里的电子,正常情况下被束缚在价带里。但温度给了它们能量,一些电子就能跳到导带,形成自由电子-空穴对。这些自由电子被光电二极管的势阱收集,就成了暗电流。

我习惯把暗电流的来源分成三类:

  • 扩散电流:中性区产生的少数载流子扩散到耗尽区被收集。这是暗电流的主要成分。
  • 产生-复合电流:耗尽区内的缺陷能级充当了“跳板”,帮助电子从价带跃迁到导带。缺陷越多,电流越大。
  • 表面漏电流:硅-二氧化硅界面处的悬挂键和界面态,也是产生暗电流的重灾区。

关键指标:暗电流密度通常用 nA/cm² 表示。一颗好的 CIS 传感器,室温下暗电流密度应该在 10-100 pA/cm² 量级。超过这个范围,你就得检查工艺或设计问题了。

温度:暗电流的放大器

温度对暗电流的影响,可以用一个经验公式来估算:

I_dark(T) = I_dark(T_ref) × 2^((T - T_ref) / ΔT)

其中 ΔT 通常在 6-8°C 之间。什么意思呢?温度每升高 6-8°C,暗电流就翻一倍。

我在项目中遇到过一件印象深刻的事。有一款安防相机,在实验室 25°C 环境下测试,暗电流表现很好。结果客户装到中东的户外,环境温度到了 55°C。你猜怎么着?暗电流翻了 8 倍,画面全是噪点。后来我们不得不重新设计散热方案,并在固件里加入了温度补偿。

温度 (°C) 暗电流 (相对值) 典型表现
25 1× 基准值,实验室条件
35 2-3× 轻微噪点,长曝光可见
45 6-10× 明显亮度偏移,短曝光也受影响
55 20-40× 画面严重发白,动态范围大幅下降

注意:温度补偿不是万能的。当暗电流大到接近饱和电荷量时,校准算法也无能为力。这时候必须从热设计入手——散热片、热电制冷器(TEC),该上就得上。

固定模式噪声(FPN):每个像素都有自己的“个性”

暗电流是整体问题,FPN 是像素间的差异问题。同一个传感器,在完全均匀的光照下,每个像素的输出值却不相同。这就是固定模式噪声。

FPN 的来源主要有两个:

  • 像素级 FPN:每个像素的暗电流大小不同,光电二极管面积有微小差异,晶体管阈值电压也不一致。这些因素叠加,导致每个像素的“暗底”不同。
  • 列级 FPN:读出电路里,每一列共用一个放大器。列放大器之间的增益和偏置差异,会在图像上形成竖条纹。

我个人习惯把 FPN 分成两部分来处理:暗信号非均匀性(DSNU)和光响应非均匀性(PRNU)。DSNU 是零光照下的差异,PRNU 是均匀光照下的响应差异。

FPN 校准方法:我踩过的坑和总结的经验

校准 FPN,核心思路就是“减背景,除增益”。但具体怎么做,有很多细节。

方法一:两点校正法

这是最经典的方法,也是我最早学会的方法。步骤很简单:

  1. 采集暗帧:盖上镜头盖,拍一张全黑图像。这张图记录了每个像素的暗电流偏移。
  2. 采集亮帧:用均匀光源照射,拍一张中等亮度的图像。这张图包含了像素的响应差异。
  3. 计算校正系数:对每个像素,计算增益和偏移量。
  4. 应用校正:对每一帧原始图像,逐像素减去偏移,再除以增益。
// 两点校正的伪代码
// dark_frame: 暗帧平均值
// bright_frame: 亮帧平均值
// target: 目标值(亮帧的全局均值)

for each pixel (i, j):
    offset[i][j] = dark_frame[i][j]
    gain[i][j] = (bright_frame[i][j] - offset[i][j]) / target

// 校正
for each pixel (i, j):
    corrected[i][j] = (raw[i][j] - offset[i][j]) / gain[i][j]

我的经验:采集暗帧时,曝光时间要和实际使用一致。我曾经偷懒,用短曝光采集暗帧,然后用在长曝光场景下。结果暗电流差异没被完全消除,画面边缘出现了奇怪的色块。记住:暗电流和曝光时间成正比,校准条件必须匹配使用条件。

方法二:动态暗帧更新

两点校正法有个问题:暗电流随温度变化。校准时的温度和使用时的温度不一样,校正效果就会打折扣。

我后来在项目中用了一个改进方案:

  • 在传感器上集成温度传感器,实时读取芯片温度。
  • 预存多组不同温度下的暗帧和校正系数。
  • 运行时根据当前温度,插值计算对应的校正参数。

这样做的好处是,温度变化 20°C 以内,FPN 残留可以控制在 1 LSB 以内。

方法三:列级 FPN 的专门处理

列级 FPN 在图像上表现为竖条纹,人眼对竖条纹特别敏感。我建议单独处理:

  1. 对每一列像素,计算该列所有像素的均值。
  2. 计算所有列均值的全局均值。
  3. 每列减去自己的均值,再加上全局均值。

这个方法简单有效,但要注意:如果场景里有垂直的亮边(比如窗户框),会被误当成列 FPN 消除掉。我一般会在检测到图像边缘时,降低列校正的强度。

知识结构图:暗电流与 FPN 的完整链路

下面这张图,是我自己整理的知识框架。它把暗电流的产生、温度影响、FPN 分类和校准方法串在了一起。

暗电流与固定模式噪声知识结构图 暗电流与固定模式噪声知识结构 暗电流与FPN 暗电流产生机制 温度对暗电流影响 固定模式噪声(FPN) 扩散电流 产生-复合电流 表面漏电流 每6-8°C翻倍 温度补偿策略 热设计(TEC/散热) 像素级FPN 列级FPN DSNU / PRNU 两点校正法 动态暗帧更新 列级FPN校正 FPN残留 < 1 LSB(温度稳定时) 校准的关键:暗帧采集条件必须与实际使用条件一致(曝光时间、温度、增益) 温度变化超过10°C时,建议启用动态暗帧更新或重新校准

校准流程中的避坑指南

做 FPN 校准这么多年,我踩过不少坑。挑几个典型的说说:

  • 暗帧采集时漏光:我曾经用黑色胶带贴镜头,以为万无一失。结果胶带边缘漏光,暗帧里出现了奇怪的渐变。后来我改用金属镜头盖,问题才解决。
  • 均匀光源不均匀:采集亮帧时,光源的均匀性至关重要。我用积分球做光源,均匀性可以做到 99% 以上。如果只用两个灯泡对着照,校正出来的图像会有明暗斑块。
  • 增益和偏移的耦合:两点校正法假设增益和偏移是独立的。实际上,有些像素的偏移会随增益变化。遇到这种情况,我建议做多点校正,或者用分段线性模型。
  • 校准系数的存储:校准系数要存到非易失存储器里。我习惯用 16 位精度存储,避免量化误差引入新的噪声。

一个小技巧:在校准完成后,拍一张全黑图像,用伪彩色显示残差。如果残差图像里还有明显的结构(比如竖条纹或斑点),说明校准没到位。这时候别急着量产,回头检查校准流程。

暗电流和 FPN 的校准,说难不难,说简单也不简单。关键是把物理机制理解透,再根据实际场景选择合适的校准策略。温度、曝光时间、增益——这三个参数只要有一个变了,校准效果就可能打折扣。我的建议是:在设计阶段就把校准方案想清楚,别等到量产了才发现问题。