1.1. 坏点是怎么产生的
坏点在图像传感器中产生的原因多种多样,主要分为静态坏点和动态坏点两种,静态坏点的产生主要包括以下几个方面:
传感器制造缺陷:图像传感器由成千上万的像素组成,每个像素都是一个微小的光电二极管。在制造过程中,可能会因为材料缺陷、制造工艺等问题导致某些像素损坏或性能不达标,从而形成坏点。
物理损伤:传感器可能因为跌落、撞击或其他物理因素导致损坏,产生坏点。
长时间使用:随着使用时间的增加,传感器上的某些像素可能会因为过度使用而退化,表现为坏点。
高温影响:高温环境可能会影响传感器的性能,导致像素损坏或性能下降。
而静态坏点是随机的,其产生的原因也有以下几个方面:
软件问题:在某些情况下,软件错误或固件缺陷也可能导致图像中出现异常像素点,表现为坏点。
图像传输错误:在图像从传感器传输到处理单元的过程中,可能会因为传输错误导致某些像素数据不正确。
电磁干扰:传感器可能受到外部电磁场的干扰,影响像素的正常工作。
像素老化:像素元件随着时间的推移可能会自然老化,导致响应度下降或失效。
1.2. 坏点是什么样子的
坏点被认为是噪声的一种,其噪声模型为椒盐噪声,从名字就可以看出来,胡椒是黑色,食盐为白色,要在图像上表现出非黑即白,这个噪点要么是最大像素值,要么是最小像素值,但是不一定,总体上来讲,坏点在图像上表现为孤立点。
本节以椒盐噪声模型作为坏点模型,在RAW图上添加坏点,得到的测试图如图1所示,左边是添加了坏点的RAW图,右边是左图经过Demosaic得到的RGB图像。

如果把图像放大会有一个发现(如图2所示),在Demosaic前坏点是独立的,Demosaic后部分坏点居然连在一起了,这是因为Demosaic的本质是一个插值算法,它成功的把一个坏点插值成了好几个坏点,所以在ISP的pipeline中,去坏点在Demosaic前面。

为了能符合ISP的pipeline又方便对比效果,接下来的测试都是在RAW图上去坏点,再将去坏点后的图像用Demosaic插值显示出来。
1.3. 设计一个去坏点算法
算法都是一步一步改进出来的,接下来楼主用去坏点算法做个示例,来展示如何暴露问题逐步改进算法,最终获得满意的结果。
1.3.1. 中值滤波
去坏点最常用的算法就是中值滤波,异想天开一下,把图1中加了坏点的RAW图直接拿过来做个3x3的中值滤波,效果如图3所示。

乍一看效果似乎还不错?坏点都没了?事实是,效果一塌糊涂,楼主的这个idea简直糟透了。了解过Demosaic的都知道,RAW图如图2(a)所示,以2x2像素为最小单位,每个最小单位里面包含两个G分量、一个R分量和一个B分量,三分量的亮度差异很大。在经过中值滤波之后,R、G、B三分量的差异被抹平了,得到了图3(a)的结果,虽然坏点没了,但是RAW图也失效了。对RAW进行Demosaic得到的结果如图3(b)所示,除了帽子的边缘部分能勉强看出一点儿蓝色,其他部分和(a)没太大差异,这说明Demosaic对非RAW图没起作用,这种三通道一起去坏点的方法直接让RAW图失效了。
以上说明直接对RAW做中值滤波去坏点是不可行的,R、G、B三通道不能混在一起用中值滤波,那就试试三通道分别使用中值滤波。
1.3.2. 分通道中值滤波
常规思路是直接把RAW图拆成R、G、B三个通道各自独立的三张图,但是在实际应用中,存在G通道不平衡的情况,简单来说光在经过滤镜的时候,由于光的能量会溢出,两个G分量会受到旁别颜色的影响,所以和R同一行的G被标记为Gr,和B同一行的被标记为Gb。这种能量溢出造成了虽然都是G分量,但是Gr和Gb存在微小的差距。考虑到实际应用中G通道可能存在不平衡的情况,因此把G也按照Gr和Gb拆成两个通道,这样一幅RAW图就变成了R、Gr、Gb和B四个独立通道的图像,如下图4所示:

对上面的四个通道分别使用3x3中值滤波,得到的四个去噪结果如下图5所示:

在图4中坏点被去掉了,图像变得很干净,把4个通道的图像重新拼成RAW图的格式,用Demosaic解析出来看一下去坏点的效果,如图6所示:

这次Demosaic效果正常了,这说明分通道使用中值滤波的思路是正确的,但是和原图相比,图像的边缘模糊的很严重,这说明在使用中值滤波结果替换坏点的之前需要一个坏点检测机制,只针对有坏点的位置使用中值滤波。
1.3.3 坏点检测+中值滤波
想把坏点检测出来就要分析坏点的特点,坏点一般是孤立的点,这说明,在3x3窗口内的最大值或者是最小值就有可能是坏点,在3x3窗口内设立判定标准:
- 判断3x3的中心点是否是9个像素中的最大值或者最小值
- 先计算中心点减去周围8个像素的绝对值,然后计算均值,判断该均值是否超过设定的阈值threshold
以上两个条件如果同时满足,则判断当前3x3窗口的中心点为坏点。按照这个判断标准,得到R、Gr、Gb和B四个分量的坏点检测结果及去坏点结果如下图7所示。

图7中的左边是R、Gr、Gb和B有坏点的输入图像,中间是4幅图像的坏点检测结果,白色的点就是标记出的坏点位置,右边是用中值滤波替换坏点后的结果。用Demosaic解析出来看一下去坏点的效果,如图8所示:

效果提升了很多,但是也不算特别优秀,在帽子的羽毛处可以看出检测的结果并不是很好,羽毛处的一些边缘被标记成了坏点,此外,背景区域也有不少坏点漏检测,这说明坏点检测部分还有可以提升的空间,如果加入边缘检测辅助坏点判断,也许可以获得更好的效果。