坏点校正(DPC)基础概念

各位工程师,咱们今天聊聊坏点校正。说白了,就是处理图像传感器上那些「不听话」的像素点。

我刚开始调图像的时候,最头疼的就是屏幕上突然冒出来的白点或黑点。你以为是镜头脏了,擦了半天发现还在原位——嗯,那就是坏点。

什么是坏点?

坏点,就是图像传感器阵列中,光电响应特性偏离正常范围的像素单元。正常像素在无光照时输出接近黑电平,有光照时线性响应。坏点则不然。

我习惯把坏点分成两类:

  • Hot Pixel(热像素):输出始终偏亮,甚至无光照时也输出高值。表现为固定白点。
  • Dead Pixel(死像素):输出始终偏暗或固定值,对光照无响应。表现为固定黑点或灰点。

关键指标:坏点通常定义为响应偏离正常值超过 ±20% 或固定噪声超过 3σ 的像素。不同 sensor 厂商标准略有差异,但大体如此。

坏点分类:静态 vs 动态

这里有个容易混淆的点。坏点不是一成不变的,我把它分成两种:

类型 成因 特点 举例
静态坏点 制造缺陷、物理损伤 位置固定,不随温度/增益变化 出厂就有,或摔过后出现
动态坏点 温度升高、增益增大、长时间曝光 时有时无,条件触发 高温下冒白点,冷却后消失

我曾经遇到一个项目,常温下图像完美,一到夏天户外就满屏白点。排查了三天,最后发现是动态坏点随温度升高被激活了。所以调试时一定要做温度扫描测试。

避坑指南:我曾经在量产阶段才发现动态坏点问题,导致返工。建议在 sensor 选型阶段就要求供应商提供高温/高增益下的坏点分布数据。

DPC 在 ISP Pipeline 中的位置

坏点校正(Dead Pixel Correction,DPC)在 ISP 流水线中处于非常靠前的位置。为什么?因为坏点如果不先处理掉,后续的 demosaic、去噪、锐化都会把坏点信息扩散到周围像素,越处理越糟糕。

我画了一张流程图,你看看 DPC 在整个 pipeline 中的位置:

ISP Pipeline 中 DPC 的位置 Raw Data DPC BLC Demosaic 后续模块 说明: • DPC 通常在 BLC(黑电平校正)之前或紧邻 BLC 执行 • 有些架构将 DPC 放在 BLC 之后,但必须在 Demosaic 之前 • 我习惯把 DPC 放在 BLC 之前,因为坏点会影响黑电平统计的准确性

你想想看,如果坏点不先校正,demosaic 时插值算法会把坏点的错误值扩散到周围像素,形成一块亮斑或暗斑。到那时再想修,就难了。

注意:有些 ISP 把 DPC 放在 BLC 之后,但我不推荐这么做。因为坏点会影响黑电平的统计值,导致整幅图像偏色。我踩过这个坑,后来改回 DPC 先于 BLC,问题就解决了。

DPC 的两种实现思路

实际工程中,DPC 有两种主流做法:

  1. 静态坏点表校正:出厂前标定坏点坐标,烧录到 OTP 或 flash 中。运行时直接查表替换。
  2. 动态坏点检测校正:实时检测当前帧中的异常像素,用周围像素插值替换。

我个人的习惯是:静态表保底,动态检测兜底。静态表能覆盖大部分固定坏点,动态检测用来抓那些温度漂出来的动态坏点。两者配合,效果最好。

经验之谈:我曾经在一个安防项目中只用了动态检测,结果在低光照场景下误检率飙升,把正常像素当坏点修了,画面反而变糊。后来加了静态表做先验约束,误检率从 15% 降到了 0.5% 以下。

坏点检测的简单原理

坏点检测说白了就是「找不同」。拿当前像素和周围邻居比:

  • 如果当前像素值远高于或远低于周围像素,且差异超过阈值,就标记为候选坏点
  • 如果连续多帧都在同一位置出现异常,就确认为坏点

阈值怎么定?我一般用 sensor 的暗电流噪声水平乘以一个系数。比如暗电流噪声是 2 DN,阈值就设在 6-10 DN。具体要看 sensor 的 SNR 表现。

好了,坏点的基本概念就聊到这儿。记住一句话:坏点校正做不好,后面的图像处理全是白费功夫。