暗电流与固定模式噪声:从物理根源到校准实战
做图像传感器这些年,我花在暗电流和固定模式噪声上的时间,比任何其他模块都多。你想想看,一个传感器在完全无光的环境下,居然还能读出信号——这本身就是个让人头疼的事。更麻烦的是,每个像素的“漏电”程度还不一样,拍出来的画面就像一块脏玻璃。
这一节,我们就来拆解这两个问题。我会从物理机制讲起,再给出我实际项目中验证过的校准方法。
暗电流是怎么来的?
暗电流,说白了就是像素在没有光照时产生的电荷。它不是凭空冒出来的,根源在半导体物理里。
硅材料里的电子,正常情况下被束缚在价带里。但温度给了它们能量,一些电子就能跳到导带,形成自由电子-空穴对。这些自由电子被光电二极管的势阱收集,就成了暗电流。
我习惯把暗电流的来源分成三类:
- 扩散电流:中性区产生的少数载流子扩散到耗尽区被收集。这是暗电流的主要成分。
- 产生-复合电流:耗尽区内的缺陷能级充当了“跳板”,帮助电子从价带跃迁到导带。缺陷越多,电流越大。
- 表面漏电流:硅-二氧化硅界面处的悬挂键和界面态,也是产生暗电流的重灾区。
关键指标:暗电流密度通常用 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,核心思路就是“减背景,除增益”。但具体怎么做,有很多细节。
方法一:两点校正法
这是最经典的方法,也是我最早学会的方法。步骤很简单:
- 采集暗帧:盖上镜头盖,拍一张全黑图像。这张图记录了每个像素的暗电流偏移。
- 采集亮帧:用均匀光源照射,拍一张中等亮度的图像。这张图包含了像素的响应差异。
- 计算校正系数:对每个像素,计算增益和偏移量。
- 应用校正:对每一帧原始图像,逐像素减去偏移,再除以增益。
// 两点校正的伪代码
// 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 在图像上表现为竖条纹,人眼对竖条纹特别敏感。我建议单独处理:
- 对每一列像素,计算该列所有像素的均值。
- 计算所有列均值的全局均值。
- 每列减去自己的均值,再加上全局均值。
这个方法简单有效,但要注意:如果场景里有垂直的亮边(比如窗户框),会被误当成列 FPN 消除掉。我一般会在检测到图像边缘时,降低列校正的强度。
知识结构图:暗电流与 FPN 的完整链路
下面这张图,是我自己整理的知识框架。它把暗电流的产生、温度影响、FPN 分类和校准方法串在了一起。
校准流程中的避坑指南
做 FPN 校准这么多年,我踩过不少坑。挑几个典型的说说:
- 暗帧采集时漏光:我曾经用黑色胶带贴镜头,以为万无一失。结果胶带边缘漏光,暗帧里出现了奇怪的渐变。后来我改用金属镜头盖,问题才解决。
- 均匀光源不均匀:采集亮帧时,光源的均匀性至关重要。我用积分球做光源,均匀性可以做到 99% 以上。如果只用两个灯泡对着照,校正出来的图像会有明暗斑块。
- 增益和偏移的耦合:两点校正法假设增益和偏移是独立的。实际上,有些像素的偏移会随增益变化。遇到这种情况,我建议做多点校正,或者用分段线性模型。
- 校准系数的存储:校准系数要存到非易失存储器里。我习惯用 16 位精度存储,避免量化误差引入新的噪声。
一个小技巧:在校准完成后,拍一张全黑图像,用伪彩色显示残差。如果残差图像里还有明显的结构(比如竖条纹或斑点),说明校准没到位。这时候别急着量产,回头检查校准流程。
暗电流和 FPN 的校准,说难不难,说简单也不简单。关键是把物理机制理解透,再根据实际场景选择合适的校准策略。温度、曝光时间、增益——这三个参数只要有一个变了,校准效果就可能打折扣。我的建议是:在设计阶段就把校准方案想清楚,别等到量产了才发现问题。