4、坏点校正:坏点检测算法、动态/静态校正、调试注意事项
坏点校正,说白了就是给图像传感器“排雷”。
每个传感器出厂时都带着一些“天生缺陷”——有的像素点永远亮着(白点),有的永远暗着(黑点),还有的时好时坏(闪烁点)。如果不处理,拍出来的照片就会像长了麻子一样,看着特别难受。
我刚开始做ISP调试时,就吃过坏点的亏。有一次客户投诉说夜景照片上有“星星”,我查了半天才发现是坏点没校干净。嗯,从那以后我对坏点校正就格外上心。
4.1 坏点检测算法:怎么找到这些“捣蛋鬼”?
坏点检测,核心思路就一句话:看这个像素跟邻居比,是不是太“另类”了。
常用的检测方法有几种:
- 邻域比较法:拿当前像素跟周围8个或24个邻居比。如果差值超过某个阈值,就标记为候选坏点。这个方法简单,但容易把图像边缘误判为坏点。
- 梯度统计法:计算像素在水平和垂直方向的梯度变化。坏点通常会在多个方向上产生异常大的梯度。我个人习惯用这个方法,误判率相对低一些。
- 多帧一致性检测:连续拍几帧,看同一个位置像素值是否稳定。闪烁的坏点(比如受温度影响时好时坏的那种)用这个方法最有效。
关键参数:检测阈值。阈值设得太小,会把正常像素误判为坏点(过杀);设得太大,又会漏掉真正的坏点(漏杀)。我一般建议先设一个宽松的阈值,宁可漏杀也不要过杀——因为漏掉的坏点后面还有校正步骤可以补救,但过杀造成的细节损失是没法恢复的。
4.2 静态校正 vs 动态校正:两种不同的“排雷”策略
坏点校正分两种:静态校正和动态校正。它们各有各的适用场景,我分别说说。
4.2.1 静态校正:出厂前就定好的“黑名单”
静态校正,就是在产线上把每个传感器的坏点位置记录下来,存到OTP(一次性可编程)存储器里。ISP工作时直接查表,把这些位置的像素值替换掉。
优点很明显:
- 计算量小,几乎不占资源
- 稳定可靠,不会误判
- 适合固定坏点(比如出厂时就有的死点)
缺点也有:
- 只能处理已知的坏点
- 传感器老化后产生的新坏点,它管不了
- OTP空间有限,一般只能存几十到几百个坏点坐标
我在项目中遇到过一个问题:某款传感器用了半年后,坏点数量翻了一倍。静态校正完全没辙,最后还是靠动态校正兜底才解决。
4.2.2 动态校正:实时检测、实时处理
动态校正不依赖预存数据,而是每帧图像实时检测坏点并校正。它更像一个“巡逻兵”,随时发现异常随时处理。
动态校正的流程一般是:
- 对每个像素做坏点检测(用前面说的邻域比较或梯度统计)
- 如果判定为坏点,就用周围像素的插值结果替换它
- 常用的插值方法有:中值滤波、均值滤波、双边滤波
我的经验:动态校正的阈值最好跟ISO联动。ISO越高,噪声越大,阈值也要跟着放大,否则会把噪声点误判为坏点。我曾经调试过一款手机摄像头,ISO 3200时噪声水平是ISO 100的8倍,阈值不跟着调的话,整个画面都会被“校正”成一片模糊。
4.3 调试注意事项:这些坑我都踩过
坏点校正看起来简单,但实际调试中坑不少。我挑几个最常见的说说。
4.3.1 注意“过杀”和“漏杀”的平衡
这是坏点校正最核心的权衡。过杀会让图像细节丢失,尤其是纹理丰富的区域;漏杀则会让坏点残留,影响观感。
我的建议是:
- 先做静态校正,把已知坏点处理干净
- 动态校正的阈值设得保守一些,宁可漏杀几个坏点,也不要过杀
- 漏掉的坏点可以通过后续的降噪模块来掩盖
警告:千万不要为了追求“零坏点”而把动态校正阈值设得太低。我曾经见过一个团队,把阈值设到噪声水平以下,结果拍出来的照片像被磨皮了一样,细节全没了。客户一看就炸了。
4.3.2 温度对坏点的影响
传感器温度升高时,暗电流会增加,原本正常的像素可能变成“热像素”。这个问题在长曝光和高温环境下特别明显。
我的做法是:
- 在产线做静态校准时,把传感器加热到工作温度上限再标定
- 动态校正的阈值随温度做线性调整
- 长曝光模式下(比如夜景),适当提高动态校正的灵敏度
4.3.3 坏点校正的位置
坏点校正应该放在ISP流水线的哪个位置?这个问题我纠结过很久。
一般来说:
- 静态校正放在最前面,在BLC(黑电平校正)之后、去噪之前
- 动态校正可以放在去噪之后,因为去噪能先滤掉一部分噪声,减少误判
但要注意:如果动态校正放在去噪之后,坏点周围的像素已经被去噪处理过了,插值结果会更平滑。代价是计算量会大一些。
4.3.4 坏点表的维护
静态校正的坏点表不是一成不变的。我建议:
- 每批传感器抽检,更新坏点表
- 传感器老化测试后,重新标定一次
- 坏点表要留有余量,别把OTP存满了
一句话总结:坏点校正不是一锤子买卖。静态校正打基础,动态校正做补充,两者配合才能把图像质量做到位。调试时多留个心眼,别让坏点成了你照片里的“不速之客”。