黑电平校正(BLC)与去噪预处理

黑电平校正和去噪,是ISP Pipeline里最靠前的两个模块。很多人觉得它们简单,不就是减个值、磨个皮嘛。但说实话,这两个模块调不好,后面所有模块都会跟着遭殃。我见过不少项目,白天效果还行,一到暗光就翻车,十有八九是BLC和去噪的底子没打好。

BLC原理:为什么要有黑电平?

先说说黑电平是怎么来的。Sensor在完全没有光照的情况下,理论上输出应该是0。但实际不是这样——由于电路本身的暗电流、ADC的偏置,即使盖上镜头盖,sensor也会输出一个非零值。这个值就是黑电平。

BLC要做的,就是把每个像素减去这个基准值,让“纯黑”回到0附近。否则你拍出来的黑色物体发灰,暗部细节也全被抬升的底噪淹没了。

核心公式:

P_out = P_raw - BLC_offset

其中BLC_offset通常取OB(Optical Black)区域的像素均值。

OB区域是sensor边缘被遮挡的像素行/列,它们接收不到光,专门用来测量当前帧的黑电平。我个人习惯在调试时先确认OB区域是否稳定——如果OB值跳变超过1个LSB,说明sensor供电或温度有问题,这时候调BLC是白费力气。

BLC调试方法:别只减一个固定值

很多工程师上来就写死一个BLC值,这在实验室环境可能没问题,但到了实际场景就露馅了。为什么?因为黑电平会随温度和增益变化。

影响因素 变化趋势 典型范围
温度升高 BLC增大(暗电流增加) 每10°C约增加0.5~2 LSB
模拟增益增大 BLC被放大 增益每翻倍,BLC约翻倍
曝光时间变长 BLC缓慢增大 长曝光时需逐帧校准

所以实际调试时,我建议至少做两件事:

  1. 建立BLC查找表:在不同增益和温度下采集OB值,做成二维LUT。运行时查表插值,而不是用固定值。
  2. 逐帧校准:每帧都从OB区域取均值,减去当前帧的BLC。这样能跟上温度变化。

小技巧:OB区域通常有几十行/列,取均值时记得剔除异常像素(比如坏点)。我一般用中位数滤波后再取均值,能有效避免个别坏点污染BLC值。

固定模式噪声(FPN)消除

FPN是sensor的“胎记”——每个像素对光的响应不完全一致,导致均匀光照下出现固定的条纹或网格。这种噪声在低增益下不明显,但增益一拉高,它就原形毕露了。

FPN分两种:

  • 行FPN:整行偏亮或偏暗,表现为水平条纹。通常是读出电路差异造成的。
  • 列FPN:垂直方向的固定偏差,表现为竖条纹。跟ADC或列放大器有关。

消除FPN的方法,说白了就是“记住每个像素的偏差,然后减掉它”。具体做法:

  1. 在暗场(盖上镜头盖)下采集多帧图像,平均后得到每个像素的暗场偏移。
  2. 在均匀光照下采集亮场,减去暗场后,再计算每个像素相对于均值的增益偏差。
  3. 将这两个校正系数存入sensor的OTP或系统校准文件。

注意:FPN校准不是一劳永逸的。sensor老化、温度变化、甚至镜头安装应力都会改变FPN特性。我建议产线校准后,在设备每次启动时做一次快速校验——只测OB区域的FPN,如果偏差超过阈值就触发重新校准。

暗电流补偿:温度是最大的敌人

暗电流是sensor在没有光照时,由于热激发产生的电子。它跟温度呈指数关系——温度每升高6~8°C,暗电流翻倍。这就是为什么手机拍夜景时间长了,画面会越来越“脏”。

暗电流补偿通常和BLC一起做,但有个区别:BLC是减固定偏移,暗电流补偿需要根据曝光时间和温度动态调整。

我做过一个项目,sensor在60°C时暗电流比25°C时大了将近10倍。如果只用常温下的BLC值,高温下暗部全是红绿噪点。后来我们加了一个温度传感器,建立了暗电流-温度模型,才把这个问题压下去。

补偿公式大致是:

暗电流补偿值 = 基准暗电流 × 2^((T - T_ref) / T_double) × 曝光时间

其中T_double是暗电流翻倍的温度步长,不同sensor差异很大,需要实测。

2D/3D去噪的权衡策略

去噪是ISP里最“艺术”的模块。调得太轻,噪声满天飞;调得太重,细节全没了。2D去噪和3D去噪各有各的脾气。

维度 2D去噪(空域) 3D去噪(时域)
原理 对单帧图像做空间滤波 利用多帧信息做时域滤波
优点 无运动鬼影,实现简单 去噪能力强,保留细节好
缺点 容易损失纹理细节 运动场景有拖影/鬼影
适用场景 运动场景、抓拍 静态场景、视频

实际调试中,我很少只用一种。我的策略是:

  • 低噪声场景(白天):2D去噪开轻一点,3D去噪可以关掉或开极弱。保留锐度最重要。
  • 中等噪声(室内灯光):2D去噪中等强度,3D去噪开弱档。注意运动区域的保护。
  • 高噪声(暗光):2D去噪拉满,3D去噪也开强。但必须配合运动检测,否则一动就糊。

我的经验法则:3D去噪的强度不要超过2D去噪的1.5倍。否则一旦有运动,鬼影会非常明显。我曾经在一个监控项目里把3D去噪开到了2倍,结果人走过去后面拖了一条“尾巴”,被客户当场打回。

另外,去噪一定要和BLC/FPN配合好。如果BLC没调准,暗部有偏色,去噪会把偏色也“磨”均匀,变成一片色块。所以我的调试顺序永远是:先调BLC → 再消FPN → 然后做暗电流补偿 → 最后才碰去噪参数。前面没调好,后面都是白费。

ISP预处理模块流程与权衡 Raw Sensor数据 黑电平校正(BLC) FPN消除 暗电流补偿 2D空域去噪 3D时域去噪 调试顺序: BLC → FPN → 暗电流 → 去噪 权衡关键: 去噪强度 vs 细节保留

最后说一句,去噪参数不要全局统一。我习惯把图像分成亮区、中间区、暗区三个区域,分别设置去噪强度。暗区噪声最明显,去噪可以重一些;亮区细节多,去噪要轻。很多ISP芯片支持这种分区去噪,用起来效果立竿见影。