2. 黑电平校正原理
好,咱们进入正题。黑电平校正,说白了就是告诉相机:「你看到的零,不一定是真的零。」
我刚开始接触ISP流水线时,总觉得这步可有可无。直到有一次,我在暗光下拍了一张纯黑卡片,结果发现像素值不是0,而是跳到了50多。嗯,从那以后我再也不敢跳过黑电平校正了。
2.1 黑电平的定义
黑电平,英文叫Black Level。它指的是:在完全没有光入射的情况下,传感器像素输出的数字值。
理想情况下,没光就应该输出0。但现实世界没这么完美。你想想看,传感器是一个电子器件,它有自己的「底噪」。这个底噪会让像素在暗场下输出一个非零的偏移量。
这个偏移量,就是黑电平。
关键理解:黑电平不是噪声,它是一个固定的直流偏移。噪声是叠加在这个偏移之上的随机波动。
不同传感器、不同增益、不同温度下,黑电平的值都不一样。我见过最夸张的一次,某款CMOS在高温下黑电平漂了30多个DN(Digital Number)。如果不校正,整张画面都会偏灰,暗部细节直接废掉。
2.2 暗电流与噪声来源
为什么会存在黑电平?这就要聊到暗电流了。
暗电流,是传感器在没有光照时,由于热激发产生的电子-空穴对。温度越高,暗电流越大。这就是为什么手机拍夜景时,画面噪点特别多——传感器发热了。
暗电流的来源主要有三个:
- 扩散暗电流:少数载流子在耗尽区外扩散产生的。这个跟掺杂浓度有关,工艺定了就基本定了。
- 耗尽区产生暗电流:耗尽区内的缺陷能级充当了产生中心。这个跟工艺质量强相关。
- 表面暗电流:硅-二氧化硅界面处的表面态引起的。嗯,这个最麻烦,跟工艺和老化都有关。
除了暗电流,还有几个噪声源也在贡献黑电平偏移:
| 噪声类型 | 来源 | 特性 |
|---|---|---|
| 复位噪声(KTC噪声) | 像素复位开关的热噪声 | 与温度、电容相关,低频为主 |
| 读出噪声 | 模拟前端(AFE)电路 | 与读出速率相关,高速时更明显 |
| 1/f噪声 | MOS管沟道载流子俘获/释放 | 低频段显著,工艺越老越明显 |
| 散粒噪声 | 暗电流本身的量子特性 | 服从泊松分布,均方根等于均值平方根 |
这些噪声叠加在一起,就形成了我们看到的黑电平偏移。注意,噪声是随机的,但黑电平偏移是相对固定的——这就是我们能校正它的前提。
2.3 校正的数学原理
好,现在讲核心。黑电平校正的数学原理,简单到令人发指:
减去一个固定的偏移量。
公式长这样:
I_corrected(x, y) = I_raw(x, y) - black_level
其中:
I_raw(x, y)是原始像素值black_level是黑电平偏移量I_corrected(x, y)是校正后的像素值
就这么简单?对,就这么简单。但坑都在细节里。
注意:校正后的值可能变成负数。比如原始值是50,黑电平是64,减完就是-14。负数不能直接存成无符号整数,所以一般会做截断或加一个偏置。
实际工程中,黑电平的获取方式有两种:
- OB(Optical Black)像素法:传感器边缘有一圈被金属遮挡的像素,它们永远收不到光。这些像素的输出平均值,就是当前帧的黑电平。
- 暗场标定法:在完全无光的环境下,拍一张全黑图,统计全图或分区的平均值,写入传感器寄存器或校准表。
我个人习惯用OB像素法。为什么?因为它能实时跟踪温度和增益变化。暗场标定法虽然精度高,但标定一次管一天——温度一变,黑电平就漂了。
我曾经在一个项目中吃过这个亏。当时用了暗场标定法,白天拍没问题。到了晚上,传感器温度升了15度,黑电平漂了20个DN,整张画面灰蒙蒙的。后来改成OB像素法,每帧都动态更新黑电平,问题就解决了。
2.4 黑电平校正的完整流程
下面这张图,是我画的黑电平校正知识结构。你看一眼就能明白整体逻辑:
2.5 工程中的坑与对策
讲几个我踩过的坑,希望对你有帮助。
避坑1:OB像素数量不够
我曾经在一个项目中,OB像素只有4行。结果每帧算出来的黑电平波动很大,校正后反而引入了行噪声。后来我把OB像素扩展到16行,取中值而不是均值,波动就压下去了。
避坑2:黑电平随增益变化
模拟增益每增加一倍,黑电平也会跟着放大。所以校正时,黑电平要乘以当前增益倍数。公式变成:I_corrected = I_raw - black_level * gain。这个坑我栽过两次,记住了。
避坑3:Bayer阵列不同通道的黑电平可能不同
R、Gr、Gb、B四个通道,由于工艺微差和电路布局不同,黑电平可能不一样。我建议每个通道单独统计OB像素,分别校正。否则会出现色偏,尤其是暗部偏绿或偏紫。
好了,黑电平校正的原理就这些。说白了就是「找到那个偏移量,然后减掉它」。但工程实现时,温度、增益、通道差异、OB像素设计,每一个细节都可能翻车。多留个心眼,总没错。