黑电平校正(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缓慢增大 | 长曝光时需逐帧校准 |
所以实际调试时,我建议至少做两件事:
- 建立BLC查找表:在不同增益和温度下采集OB值,做成二维LUT。运行时查表插值,而不是用固定值。
- 逐帧校准:每帧都从OB区域取均值,减去当前帧的BLC。这样能跟上温度变化。
小技巧:OB区域通常有几十行/列,取均值时记得剔除异常像素(比如坏点)。我一般用中位数滤波后再取均值,能有效避免个别坏点污染BLC值。
固定模式噪声(FPN)消除
FPN是sensor的“胎记”——每个像素对光的响应不完全一致,导致均匀光照下出现固定的条纹或网格。这种噪声在低增益下不明显,但增益一拉高,它就原形毕露了。
FPN分两种:
- 行FPN:整行偏亮或偏暗,表现为水平条纹。通常是读出电路差异造成的。
- 列FPN:垂直方向的固定偏差,表现为竖条纹。跟ADC或列放大器有关。
消除FPN的方法,说白了就是“记住每个像素的偏差,然后减掉它”。具体做法:
- 在暗场(盖上镜头盖)下采集多帧图像,平均后得到每个像素的暗场偏移。
- 在均匀光照下采集亮场,减去暗场后,再计算每个像素相对于均值的增益偏差。
- 将这两个校正系数存入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芯片支持这种分区去噪,用起来效果立竿见影。