4、暗电流测量方法:暗帧采集、均值与标准差计算、温度控制实验

暗电流这东西,说白了就是传感器在没光的时候自己产生的噪声。你想想看,一个号称「零光照」的场景下,像素居然还能读出信号——这就是暗电流在捣鬼。我入行那会儿,第一次测暗电流就被坑过,测出来的数据忽高忽低,后来才发现是温度没控好。

这一章,我就把暗电流的测量方法掰开揉碎了讲。核心就三件事:怎么拍暗帧、怎么算均值和标准差、怎么控温度。这三步走对了,暗电流数据才靠谱。

4.1 暗帧采集:从原理到实操

暗帧,就是完全遮住镜头、在零光照条件下采集的图像帧。听起来简单,但细节决定成败。

暗帧采集的核心原则:

  • 完全遮光:用镜头盖 + 黑胶带双重保险,确保无任何杂散光进入
  • 曝光时间:至少覆盖你实际使用的曝光范围,通常从 1ms 到 10s 不等
  • 帧数:单次采集至少 100 帧,用于后续统计计算
  • 增益设置:保持与实际应用一致的增益,因为暗电流与增益无关,但读出噪声会受影响

我个人习惯的做法是:先盖上镜头盖,再用黑色遮光布把整个相机模组包起来。然后设置好曝光时间,连续采集 200 帧暗帧。为什么要 200 帧?因为帧数太少,统计结果不稳定;帧数太多,存储和计算压力大。200 帧是个不错的平衡点。

这里有个坑——热像素。有些像素天生暗电流特别大,会拉高整体均值。我建议在采集前先做一次热像素标定,或者在后处理时剔除这些异常点。

4.2 均值与标准差计算:从数据到指标

拿到暗帧后,怎么算暗电流?其实暗电流本身不能直接测量,我们测的是暗信号——也就是暗电流在曝光时间内累积的电荷量。

计算分两步走:

  1. 计算每帧的像素均值:对每一帧暗帧,计算所有像素的灰度平均值
  2. 计算多帧的均值和标准差:对 200 帧的均值序列,再求一次均值和标准差

最终得到的均值就是暗信号水平,标准差就是暗噪声水平。暗电流的计算公式是:

暗电流 (e-/s) = 暗信号 (DN) × 转换增益 (e-/DN) / 曝光时间 (s)

嗯,这里要注意——转换增益需要提前标定好,不然算出来的暗电流单位不对。我见过不少工程师直接拿 DN 值当暗电流,那是不对的。

下面是我常用的 Python 计算脚本:

import numpy as np
import cv2

def calculate_dark_current(dark_frames, exposure_time, conversion_gain):
    """
    计算暗电流
    dark_frames: 暗帧列表,每个元素是一帧图像
    exposure_time: 曝光时间,单位秒
    conversion_gain: 转换增益,单位 e-/DN
    """
    frame_means = []
    for frame in dark_frames:
        # 剔除热像素(可选)
        # frame = reject_hot_pixels(frame)
        frame_means.append(np.mean(frame))
    
    dark_signal_dn = np.mean(frame_means)
    dark_noise_dn = np.std(frame_means)
    
    dark_current = dark_signal_dn * conversion_gain / exposure_time
    
    return {
        'dark_signal_dn': dark_signal_dn,
        'dark_noise_dn': dark_noise_dn,
        'dark_current_e_per_s': dark_current
    }

# 使用示例
frames = [cv2.imread(f'dark_{i}.tiff', cv2.IMREAD_UNCHANGED) for i in range(200)]
result = calculate_dark_current(frames, exposure_time=1.0, conversion_gain=0.5)
print(f"暗电流: {result['dark_current_e_per_s']:.2f} e-/s")

小技巧:如果你发现暗信号均值随帧数增加而缓慢上升,说明传感器可能有发热问题。这时候需要缩短连续采集的帧数,或者加散热措施。

4.3 温度控制实验:暗电流的温度依赖性

暗电流对温度极其敏感。我记得有个项目,室温下暗电流只有 0.5 e-/s,到了 60°C 直接飙到 15 e-/s——整整 30 倍!所以温度控制实验是暗电流测量的必修课。

标准的温度控制实验流程如下:

温度点 (°C) 曝光时间 (s) 帧数 预期暗电流 (e-/s)
-10 10 100 < 0.1
0 5 100 0.1 - 0.5
25 2 200 0.5 - 2.0
40 1 200 2.0 - 8.0
60 0.5 200 8.0 - 30.0

为什么要调整曝光时间?因为温度高了暗电流大,曝光时间太长会饱和。我一般遵循一个原则:暗信号不超过满阱容量的 10%。

警告:温度控制实验最怕的是温度不均匀。我曾经用加热片直接贴在传感器背面,结果中心温度比边缘高了 5°C,测出来的暗电流数据完全不能用。后来改用恒温箱 + 导热硅脂,才解决了这个问题。

实验步骤:

  1. 将传感器放入恒温箱,设置目标温度
  2. 等待 30 分钟,让温度稳定
  3. 采集暗帧(按上表的曝光时间和帧数)
  4. 计算暗电流
  5. 重复步骤 1-4,覆盖所有温度点

最后,把不同温度下的暗电流数据画成曲线,你会看到它基本符合 Arrhenius 公式——温度每升高 6-8°C,暗电流翻一倍。这个规律可以用来推算传感器在不同温度下的性能。

暗电流测量流程 准备阶段 完全遮光 温度控制 暗帧采集 均值与标准差计算 关键参数 • 曝光时间:1ms-10s • 帧数:≥100帧 • 温度点:-10~60°C • 稳定时间:30min • 暗信号:≤10%满阱 • 转换增益:需标定 • 热像素:需剔除 • 温度均匀性:±1°C • 遮光:双重保险 • 数据记录:完整

说实话,暗电流测量看起来简单,但要做好真不容易。我见过太多人栽在温度控制上——要么温度没稳定就开始采,要么温度不均匀导致数据偏差。记住一句话:暗电流测量,温度是老大。把温度控好了,数据就准了。