坏点校正(DPC)基础概念
各位工程师,咱们今天聊聊坏点校正。说白了,就是处理图像传感器上那些「不听话」的像素点。
我刚开始调图像的时候,最头疼的就是屏幕上突然冒出来的白点或黑点。你以为是镜头脏了,擦了半天发现还在原位——嗯,那就是坏点。
什么是坏点?
坏点,就是图像传感器阵列中,光电响应特性偏离正常范围的像素单元。正常像素在无光照时输出接近黑电平,有光照时线性响应。坏点则不然。
我习惯把坏点分成两类:
- Hot Pixel(热像素):输出始终偏亮,甚至无光照时也输出高值。表现为固定白点。
- Dead Pixel(死像素):输出始终偏暗或固定值,对光照无响应。表现为固定黑点或灰点。
关键指标:坏点通常定义为响应偏离正常值超过 ±20% 或固定噪声超过 3σ 的像素。不同 sensor 厂商标准略有差异,但大体如此。
坏点分类:静态 vs 动态
这里有个容易混淆的点。坏点不是一成不变的,我把它分成两种:
| 类型 | 成因 | 特点 | 举例 |
|---|---|---|---|
| 静态坏点 | 制造缺陷、物理损伤 | 位置固定,不随温度/增益变化 | 出厂就有,或摔过后出现 |
| 动态坏点 | 温度升高、增益增大、长时间曝光 | 时有时无,条件触发 | 高温下冒白点,冷却后消失 |
我曾经遇到一个项目,常温下图像完美,一到夏天户外就满屏白点。排查了三天,最后发现是动态坏点随温度升高被激活了。所以调试时一定要做温度扫描测试。
避坑指南:我曾经在量产阶段才发现动态坏点问题,导致返工。建议在 sensor 选型阶段就要求供应商提供高温/高增益下的坏点分布数据。
DPC 在 ISP Pipeline 中的位置
坏点校正(Dead Pixel Correction,DPC)在 ISP 流水线中处于非常靠前的位置。为什么?因为坏点如果不先处理掉,后续的 demosaic、去噪、锐化都会把坏点信息扩散到周围像素,越处理越糟糕。
我画了一张流程图,你看看 DPC 在整个 pipeline 中的位置:
你想想看,如果坏点不先校正,demosaic 时插值算法会把坏点的错误值扩散到周围像素,形成一块亮斑或暗斑。到那时再想修,就难了。
注意:有些 ISP 把 DPC 放在 BLC 之后,但我不推荐这么做。因为坏点会影响黑电平的统计值,导致整幅图像偏色。我踩过这个坑,后来改回 DPC 先于 BLC,问题就解决了。
DPC 的两种实现思路
实际工程中,DPC 有两种主流做法:
- 静态坏点表校正:出厂前标定坏点坐标,烧录到 OTP 或 flash 中。运行时直接查表替换。
- 动态坏点检测校正:实时检测当前帧中的异常像素,用周围像素插值替换。
我个人的习惯是:静态表保底,动态检测兜底。静态表能覆盖大部分固定坏点,动态检测用来抓那些温度漂出来的动态坏点。两者配合,效果最好。
经验之谈:我曾经在一个安防项目中只用了动态检测,结果在低光照场景下误检率飙升,把正常像素当坏点修了,画面反而变糊。后来加了静态表做先验约束,误检率从 15% 降到了 0.5% 以下。
坏点检测的简单原理
坏点检测说白了就是「找不同」。拿当前像素和周围邻居比:
- 如果当前像素值远高于或远低于周围像素,且差异超过阈值,就标记为候选坏点
- 如果连续多帧都在同一位置出现异常,就确认为坏点
阈值怎么定?我一般用 sensor 的暗电流噪声水平乘以一个系数。比如暗电流噪声是 2 DN,阈值就设在 6-10 DN。具体要看 sensor 的 SNR 表现。
好了,坏点的基本概念就聊到这儿。记住一句话:坏点校正做不好,后面的图像处理全是白费功夫。