3. 黑电平校正算法基础:从全局减法到暗场校正
黑电平校正,说白了就是把传感器在“全黑”状态下不该有的信号给去掉。你想想看,一个理想的图像传感器,没光的时候输出应该是0。但现实世界哪有那么完美?暗电流、读出噪声、像素本身的偏移,都会让暗场下产生一个非零的基底信号。这个基底,就是黑电平。
我刚开始做ISP的时候,觉得黑电平校正不就是减一个固定值嘛,有什么难的?后来踩了不少坑才发现,这里面的门道还真不少。今天咱们就把三种最基础的校正方法掰开揉碎了讲清楚。
3.1 全局减法:最朴素的想法,最明显的局限
全局减法,就是整幅图像减去同一个常数。比如你测得暗场下的平均输出是64个DN(数字码值),那所有像素都减去64。
核心公式:
I_corrected(x, y) = I_raw(x, y) - B_global
其中 B_global 是一个全局常数,通常取暗场下的平均输出值。
这个方法简单吧?确实简单。硬件实现几乎不占资源,一个减法器就搞定了。但它的局限性也特别明显。
局限一:空间不均匀性被忽略
传感器不同位置的暗电流是不一样的。边缘像素和中心像素,温度分布不同,暗电流差异可能达到几个DN甚至十几个DN。你用同一个值去减,校正完的图像边缘可能还有残留的黑电平,或者中心被减过了头。
局限二:温度和时间漂移
暗电流对温度极其敏感。我记得有一次在户外测试,早上温度15度,中午到了35度,暗电平漂了将近20个DN。全局减法用的还是早上标定的值,结果中午的图像整体偏暗,暗部细节全丢了。
局限三:增益变化不敏感
当你改变模拟增益时,黑电平也会跟着变。全局减法如果没做增益归一化,高增益下的黑电平校正就会出问题。
| 对比项 | 全局减法 | 实际需求 |
|---|---|---|
| 空间适应性 | 无 | 需要逐像素或分区域 |
| 温度跟踪 | 固定值,不跟踪 | 需要实时或准实时更新 |
| 增益联动 | 不联动 | 需要随增益线性缩放 |
| 硬件成本 | 极低 | 可接受中等开销 |
注意:全局减法只适用于对精度要求极低、环境稳定的场景,比如某些工业检测中的二值化预处理。做消费级图像传感器的话,千万别指望它。
3.2 基于OB像素的校正方法:实时跟踪的利器
OB像素,全称是Optical Black像素,也叫光学黑像素。这些像素被金属层遮挡,收不到光,但和有效像素共用同样的读出电路。它们输出的信号,就是当前条件下最真实的黑电平参考。
我个人习惯把OB像素看作传感器自带的“暗电流监测站”。它们和有效像素挨得很近,温度、工艺偏差几乎一致,所以能提供非常准的实时黑电平信息。
3.2.1 OB像素的布局方式
常见的OB像素布局有两种:
- 行方向OB:在每行的开头或结尾放几个OB像素。优点是每行都有自己的黑电平参考,能校正行噪声。缺点是占用水平方向的空间。
- 列方向OB:在传感器边缘放几列OB像素。优点是垂直方向连续采样,能校正列方向的固定模式噪声。缺点是行噪声校正能力弱。
大多数传感器会同时使用两种方式,形成OB区域。
3.2.2 校正流程
基于OB像素的校正,一般分三步走:
- 采集OB值:读出当前帧中所有OB像素的原始值。
- 计算参考黑电平:对OB值做统计处理,比如取中位数或均值,剔除异常点。
- 逐像素校正:用计算出的参考值减去有效像素的原始值。
经验之谈:我建议用中位数而不是均值。OB像素里偶尔会有坏点,均值会被拉偏,中位数更鲁棒。我在一个项目里就吃过这个亏,均值算出来的黑电平总是偏大,后来换成中位数,问题就解决了。
3.2.3 局限与挑战
OB像素方法虽然好,但也不是万能的。
OB像素数量有限。 传感器面积就那么大,OB像素多了,有效像素就少了。所以OB区域通常只占1%-3%的像素。样本量小,统计结果的噪声就大。
OB像素和有效像素的匹配度。 虽然它们靠得很近,但微透镜、滤光片、金属走线的差异,还是会导致OB像素和有效像素的暗电流不完全一致。这个差异叫OB mismatch,需要额外校准。
行噪声残留。 如果每行的OB像素只有几个,统计出来的行黑电平可能不够准,校正后还会残留行噪声。
3.3 基于暗场的校正方法:离线标定的精度之选
暗场校正,就是在完全无光的环境下(盖上镜头盖),采集一帧或多帧图像,然后把这些图像的平均值作为黑电平参考。
这种方法的好处是:你可以得到每个像素自己的黑电平值,精度极高。坏处是:它是一次离线标定,不能实时跟踪温度和增益的变化。
3.3.1 暗帧的采集与处理
采集暗帧时,有几个关键点要注意:
- 环境必须全黑。 任何漏光都会污染暗帧。我曾经在实验室里测,发现暗帧总有一块区域偏亮,排查了半天,原来是机箱上的电源指示灯透过缝隙照进去了。
- 温度和曝光时间要稳定。 暗电流和温度、曝光时间强相关。标定时的条件要和实际使用条件一致,或者做多组标定。
- 多帧平均降噪。 单帧暗帧的噪声很大,至少要采集16帧以上做平均,才能得到稳定的黑电平参考。
暗帧生成公式:
B_dark(x, y) = (1 / N) * Σ D_i(x, y)
其中 D_i 是第 i 帧暗场图像,N 是总帧数,B_dark 是逐像素的黑电平参考。
3.3.2 校正流程
- 离线标定:在产线或实验室采集暗帧,生成逐像素的黑电平参考图。
- 存储参考图:把参考图烧录到传感器的OTP或系统的Flash里。
- 在线校正:运行时读取参考图,逐像素减去对应的黑电平值。
3.3.3 暗场校正的变体:多温度多增益标定
为了应对温度和增益的变化,工业上常用的是多组暗帧标定。比如在-10°C、0°C、25°C、50°C四个温度点,以及1x、2x、4x、8x四个增益下,分别采集暗帧。运行时根据当前温度和增益,插值出对应的黑电平参考。
| 温度 | 增益1x | 增益2x | 增益4x | 增益8x |
|---|---|---|---|---|
| -10°C | 暗帧A1 | 暗帧A2 | 暗帧A4 | 暗帧A8 |
| 0°C | 暗帧B1 | 暗帧B2 | 暗帧B4 | 暗帧B8 |
| 25°C | 暗帧C1 | 暗帧C2 | 暗帧C4 | 暗帧C8 |
| 50°C | 暗帧D1 | 暗帧D2 | 暗帧D4 | 暗帧D8 |
注意:多组标定虽然精度高,但存储开销大。一张暗帧参考图如果是12bit、1920x1080分辨率,就需要约3MB的存储空间。16组就是48MB。对于嵌入式系统来说,这个代价不小。
3.4 三种方法的对比与选择
我把三种方法的核心差异整理了一下,方便你对比:
| 方法 | 精度 | 实时性 | 存储开销 | 适用场景 |
|---|---|---|---|---|
| 全局减法 | 低 | 高 | 几乎为零 | 低端工业、玩具摄像头 |
| OB像素校正 | 中 | 高 | 低 | 消费电子、安防监控 |
| 暗场校正 | 高 | 低(离线标定) | 高 | 医疗、科研、高端工业 |
在实际项目中,我通常的做法是:OB像素校正做实时跟踪,暗场校正做离线基准。 先用暗场标定出一个基准黑电平图,然后在运行时用OB像素的实时数据去修正这个基准图。这样既保证了精度,又能跟踪环境变化。
嗯,这里要注意的是,两种方法结合时,要处理好OB像素和暗场参考之间的偏差。我一般会在标定阶段额外采集一组OB像素和暗场的对应关系,做一个线性映射,把OB值转换到暗场参考的坐标系下。
3.5 知识体系总览
下面这张图把三种方法的核心逻辑和关系梳理了一下,你可以对照着看:
三种方法各有各的用武之地。全局减法虽然粗糙,但在资源受限的场景下也能凑合用。OB像素校正是消费电子的主流选择,性价比高。暗场校正精度最高,但代价也最大。实际工程中,我建议你根据产品的成本、精度要求和环境条件,灵活组合使用。