黑电平校正(BLC)与固定模式噪声(FPN)去除:原理、调试方法、常见问题与解决方案

黑电平校正,圈内人常叫它BLC。说白了,就是告诉相机“什么是真正的黑色”。

你想想看,一个全黑的场景,传感器理论上应该输出0。但实际呢?由于暗电流、电路偏置这些因素,像素总会读出一些非零值。这些值如果不处理,画面就会发灰、发雾,暗部细节全被埋没了。

我刚开始做ISP调试那会儿,就吃过这个亏。有一款手机摄像头,夜景拍出来总是灰蒙蒙的,怎么调增益都不对。后来一查,BLC没校准好,暗电流补偿差了十几个LSB。嗯,从那以后,我每次拿到新传感器,第一件事就是看BLC曲线。

1. 黑电平校正的原理

黑电平校正的核心思路很简单:找到暗电流的基准值,然后减掉它。

传感器通常会在像素阵列的边缘预留一些光学黑像素(OB, Optical Black)。这些像素被金属层遮挡,收不到光,但和有效像素共享同样的电路结构。它们输出的值,就代表了当前条件下的暗电流水平。

核心公式:

P_out = P_raw - OB_mean

其中 OB_mean 是光学黑像素的平均值,P_raw 是原始像素值。

但事情没这么简单。OB像素本身也有噪声,直接减平均值会引入新的随机噪声。所以实际工程中,我们通常会对OB区域做中值滤波或均值滤波,甚至用多帧平均来稳定基准值。

另外,暗电流和温度、曝光时间强相关。温度每升高6-8度,暗电流翻一倍。所以高端的BLC算法会做温度补偿——查表或者多项式拟合,动态调整减去的基准值。

2. 固定模式噪声(FPN)的成因

FPN和BLC是孪生兄弟。BLC处理的是全局的暗电流偏移,而FPN处理的是像素与像素之间的差异。

为什么会这样?

每个像素的光电二极管、传输管、源跟随器,制造工艺上不可能完全一致。有的像素暗电流大一点,有的小一点。这种差异在空间上是固定的——你拍100张全黑图,同一个像素的偏移量基本不变。所以叫“固定模式噪声”。

FPN分为两种:

类型 来源 表现 校正难度
列FPN 列放大器、ADC偏移 竖条纹 低
像素FPN 单个像素暗电流差异 固定亮点/暗点 中

列FPN比较好处理,因为同一列的所有像素共享同一个读出电路,偏移量一致。像素FPN就麻烦多了,需要逐像素校准。

3. 调试方法与参数

调试BLC和FPN,我习惯按这个步骤来:

  1. 采集全黑帧:盖上镜头盖,用不同增益、不同曝光时间、不同温度拍多组数据。
  2. 计算OB均值:对每帧的OB区域做统计,得到当前帧的BLC基准值。
  3. 生成FPN校正表:对全黑帧做多帧平均,得到每个像素的固定偏移量。
  4. 验证校正效果:用校正后的全黑帧看噪声水平,用暗部灰阶卡看细节保留情况。

我的调试小技巧:

采集全黑帧时,千万别漏了不同增益的情况。高增益下暗电流会被放大,BLC基准值会漂移。我见过有人只测了0dB的BLC,结果开到24dB时暗部直接偏绿。

关键参数表:

参数 说明 典型范围 调试建议
blc_ob_region OB像素区域坐标 传感器厂商提供 确认OB区域没有被裁剪
blc_target 校正后的目标黑电平 0-64 (10bit) 通常设为0,但保留少量偏移可避免负值截断
fpn_correction_table 逐像素偏移表 ±32 LSB 用多帧平均生成,至少32帧
blc_temperature_comp 温度补偿系数 0.1-2.0 LSB/°C 通过温箱标定

4. 常见问题与解决方案

做BLC和FPN调试,有几个坑是绕不开的。我一个个说。

问题一:校正后暗部出现负值

减多了!BLC基准值算高了,导致暗部像素变成负数。后续的Gamma、去马赛克处理对负数很敏感,会出伪色。

解决方案: 保留一个小的偏移量(比如4-8 LSB),或者做截断处理。我习惯在BLC之后加一个clamp操作,把负值钳位到0。

问题二:FPN校正后出现新的条纹

这通常是FPN校正表精度不够,或者校正表和当前增益不匹配。我曾经遇到过一个案子,FPN表是在实验室25度下生成的,结果产线测试时温度到了40度,暗电流变了,校正表反而引入了新的固定噪声。

解决方案: 多温度点标定,生成多组FPN表,运行时根据温度插值切换。

问题三:BLC和AGC(自动增益控制)打架

AGC会根据画面亮度调整增益,而BLC的基准值会随增益变化。如果BLC补偿没跟上,画面亮度会抖动。

解决方案: 把BLC放在AGC之前做,或者让BLC的补偿值和增益联动。

5. 知识体系结构图

下面这张图,是我自己总结的BLC和FPN处理流程。你看一眼,整个链路就清楚了。

BLC与FPN处理流程 BLC与FPN处理流程 原始RAW数据 OB区域统计(均值/中值) BLC校正(减基准值) FPN校正(逐像素减偏移) 校正后RAW数据 温度补偿 查表/多项式拟合 FPN校正表 多帧平均生成

6. 自动化调优思路

手动调BLC和FPN,最烦的就是重复采集数据、算表、验证。我后来写了一套自动化脚本,流程是这样的:

  • 自动采集:控制温箱和光源,自动切换增益、曝光时间,拍全黑帧和灰阶卡。
  • 自动计算:对采集的数据做统计分析,自动生成BLC基准值和FPN校正表。
  • 自动验证:用校正后的数据算暗部SNR、FPN幅度,和预设阈值对比,不合格就重新采集。
  • 自动生成报告:把校正参数、验证结果、曲线图打包成PDF。

这套流程跑下来,原来需要3天的调试工作,压缩到半天。而且机器调出来的参数,比人手调的更稳定——至少不会出现“周一调的和周五调的不一样”这种尴尬事。

嗯,BLC和FPN这块,说难不难,说简单也不简单。关键是把原理吃透,把调试流程标准化,剩下的就是耐心和细心了。