本节为opencv数字图像处理(10):图像复原与重建的第一小节,常见的噪声以及空间滤波器噪声消除方法,主要包括:图像/退化复原模型,六种常见噪声模型(高斯、瑞利、爱尔兰、指数、均匀、脉冲噪声)并且使用空间滤波器对退化图像进行复原(也即消除噪声),包括算数均值、几何均值、谐波与逆谐波均值、中值、最值、中点、修正的阿尔法均值以及两种自适应滤波器(自适应局部降低噪声滤波器和自适应中值滤波器)。

1. 图像退化/复原模型

python cv2去除气泡和干扰线 opencv去噪处理_opencv进行处理,产生退化图像python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_02,给定python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_02和关于退化函数python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_04以及加性噪声项python cv2去除气泡和干扰线 opencv去噪处理_opencv_05的知识,图像复原的目的就是获得原始图像的一个估计python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_06

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_04是一个线性的位置不变的过程,那么空间域的退化图像可由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_08


  根据卷积定理,可以写成等价的频率域表示:

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_09


  基于上述过程,图像退化/复原建模如下:

python cv2去除气泡和干扰线 opencv去噪处理_opencv_10

2. 噪声模型

2.1. 重要的噪声概率密度函数

高斯噪声/正态噪声

python cv2去除气泡和干扰线 opencv去噪处理_方差_11的PDF由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_方差_12


  其中,python cv2去除气泡和干扰线 opencv去噪处理_方差_11表示灰度值,python cv2去除气泡和干扰线 opencv去噪处理_方差_14表示python cv2去除气泡和干扰线 opencv去噪处理_方差_11的均值,python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_16表示python cv2去除气泡和干扰线 opencv去噪处理_方差_11的标准差,高斯函数的曲线如下图所示,当python cv2去除气泡和干扰线 opencv去噪处理_方差_11服从上式分布时,其值有约70%落在范围python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_19内,大约95%落在python cv2去除气泡和干扰线 opencv去噪处理_方差_20内。

python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_21


瑞利噪声  瑞利噪声的PDF由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_方差_22


  概率密度的均值python cv2去除气泡和干扰线 opencv去噪处理_opencv_23,方差python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_24,瑞利密度的曲线如下所示:

python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_25


  瑞利曲线距原点的位移和密度的基本形状向右变形,瑞利密度对于近似歪斜的直方图十分适用。

爱尔兰/伽马噪声

  爱尔兰噪声的PDF由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_26


  其中,参数python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_27为正整数,概率密度的均值为python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_28,方差为python cv2去除气泡和干扰线 opencv去噪处理_方差_29,伽马分布密度曲线如下所式。【虽然一般称上式为伽马噪声,但严格来说只有分母为伽马函数python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_30时才正确,上式的密度称为爱尔兰密度更合适】

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_31


指数噪声  指数噪声的PDF由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_opencv_32


  其中python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_33,均值为python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_34,方差python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_35,下图是该密度函数的曲线:

python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_36


均匀噪声  均匀噪声的PDF由下式给出:

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_37


  均值python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_38,方差python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_39,均匀密度的曲线如下:

python cv2去除气泡和干扰线 opencv去噪处理_方差_40


脉冲/椒盐噪声  双极脉冲噪声的PDF如下:

python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_41


  如果python cv2去除气泡和干扰线 opencv去噪处理_方差_42则灰度级python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_43在图像中显示为一个两点,反之灰度级python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_44在图像中显示为一个暗点,若python cv2去除气泡和干扰线 opencv去噪处理_方差_45python cv2去除气泡和干扰线 opencv去噪处理_opencv_46为零,则脉冲噪声称为单极脉冲。如果python cv2去除气泡和干扰线 opencv去噪处理_方差_45python cv2去除气泡和干扰线 opencv去噪处理_opencv_46都不可能为零,尤其是当他们近似相等时,则脉冲噪声值将类似于在图像上随机分布的椒盐颗粒。密度曲线如下所示:

python cv2去除气泡和干扰线 opencv去噪处理_方差_49


总结

  上述噪声的PDF为实践中建立宽带噪声污染状态的模型提供了有用的工具,比如在一幅图像中,高斯噪声来源于诸如电子电路噪声以及由低照明度或高温带来的传感器噪声,瑞利密度有助于深度成像中表征噪声,指数密度和伽马密度在激光成像中有用。脉冲噪声在快速过渡的情况下产生,如成像期间发生的错误开关操作。均匀密度作为仿真中使用的许多随机数生成器的基础是非常有用的。

  下图所示是图像添加了各种噪声之后的图像与直方图对比,除了椒盐噪声之外的五幅图像表观上看起来之后亮度的差别(直方图上确实有提现)。【椒盐噪声是唯一一种引起退化的视觉上可区分的噪声类型】

python cv2去除气泡和干扰线 opencv去噪处理_opencv_50

2.2. 周期噪声

  一幅图像中的图像噪声是图像获取期间由电力或机电干扰产生的,是一种空间相关噪声,可通过频率域滤波显著减少。

  典型地,周期噪声的参数可以通过检测图像的福利也服来进行估计,因为周期噪声趋向于产生频率尖峰,有的通过视觉就可以检测到。另一种是由图像推断噪声分量的周期性(非常简单的情况下可行)

  通常噪声的PDF的参数可以从传感器的说明中的值,如果成像系统可用,我们可以获取一组平坦环境的图像,即光学传感器下对一个光照均匀的纯色灰度板成像,根据图像的直方图估计噪声类型。

3. 图像复原-空间滤波

python cv2去除气泡和干扰线 opencv去噪处理_方差_51python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_52,因为噪声项未知,所以简单减去不可行。当仅存在加性噪声时,可以选择空间滤波方法。

3.1 均值滤波器

算数均值滤波器

python cv2去除气泡和干扰线 opencv去噪处理_方差_53表示中心在点python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_54处大小为python cv2去除气泡和干扰线 opencv去噪处理_方差_55的矩形子图像窗口的一组坐标,算数均值滤波器在python cv2去除气泡和干扰线 opencv去噪处理_方差_53定易得区域计算被污染图像python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_02的平均值,在python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_54处复原图像python cv2去除气泡和干扰线 opencv去噪处理_方差_59的值就是这个算数均值:
python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_60
  这个操作可以通过一个大小为python cv2去除气泡和干扰线 opencv去噪处理_方差_55的空间滤波器来实现,其所有系数均为值得python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_62。均值滤波平滑一幅图像中的局部变化,模糊了结果降低了噪声。

几何均值滤波器

  表达式如下:
python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_63
  噪声降低效果类似,但是丢失的图像细节更少。

谐波均值滤波器

  表达式如下:
python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_64
  谐波均值滤波对盐粒噪声效果较好,但不适用于胡椒噪声。它善于处理项高斯噪声那样的其他噪声。

逆谐波均值滤波器

  表达式如下:
python cv2去除气泡和干扰线 opencv去噪处理_opencv_65
  Q称为滤波器的阶数,适合减少甚至消除椒盐噪声的影响。当Q为正数,消除胡椒噪声,当Q为负数,消除盐粒噪声。【不能同时】。当Q=0,即算术均值滤波器;当Q=-1,谐波均值滤波器。

小结

  总的来看,算数均值和集合均值更适合处理高斯或均匀随机噪声,逆谐波均值适合处理脉冲噪声,但是它必须知道噪声是暗噪声还是亮噪声,以便选择Q的符号。

3.2 统计排序滤波器

中值滤波器
  表达式:
python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_66
  中值滤波器引起的模糊更小,存在单极或双极脉冲噪声的情况下尤为有效。

最值滤波器

  最大值滤波器:
python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_67
  这种滤波器对图像中的最亮点非常有用,可以消除胡椒噪声。

  最小值滤波器:
python cv2去除气泡和干扰线 opencv去噪处理_opencv_68
  这种滤波器对图像中的最暗殿非常有用,可以消除盐粒噪声。

中点滤波器

  表达式:
python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_69
  它对于随机分布的噪声比如高斯或者均匀噪声效果最好。

修正的阿尔法均值滤波器

python cv2去除气泡和干扰线 opencv去噪处理_方差_53邻域中去掉灰度排序序列中的前d/2和后d/2,令python cv2去除气泡和干扰线 opencv去噪处理_方差_71表示剩下的python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_72个像素,由剩余像素的平均值形成的滤波器,表达式如下:
python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_73
  当d=0,算数均值滤波器;当d=mn-1,中值滤波器。当d取其他值,该滤波器在包含多种噪声的情况下效果较好,比如高斯噪声和椒盐噪声混合时。

3.3 自适应滤波器

  这里退化图像仍然是简单的原始图像加噪声,依然没有考虑其他类型的退化。

自适应局部降低噪声滤波器

python cv2去除气泡和干扰线 opencv去噪处理_方差_53,在该区域中心任意一点(x,y)上的响应基于四个量:1) python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_02,带噪图像在点python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_54处的值;2) python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_77,污染python cv2去除气泡和干扰线 opencv去噪处理_opencv形成python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_02的噪声的方差;3) python cv2去除气泡和干扰线 opencv去噪处理_opencv_80中像素的局部均值;4) python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_81python cv2去除气泡和干扰线 opencv去噪处理_方差_53中像素的局部方差 ,并且我们希望滤波器能够:

  • 如果python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_83,则返回python cv2去除气泡和干扰线 opencv去噪处理_方差_84[零噪声]
  • 如果python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_85python cv2去除气泡和干扰线 opencv去噪处理_方差_86高度相关,则返回python cv2去除气泡和干扰线 opencv去噪处理_方差_84一个近似值。典型地,高局部方差和边缘相关,应保护这些边缘。
  • 如果两个方差相等,则返回python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_88中像素的算数平均。这种情况发生在局部区域与整个图像有相同特性时,并且局部噪声将通过简单的求平均来降低。

  基于此,表达式:
python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_89
  这里需要知道或估计python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_77的值,上式中隐含python cv2去除气泡和干扰线 opencv去噪处理_方差_91,这虽然合理(模型中的噪声是加性的和位置独立的),但也可能有特殊情况,因此,这里若违反了不等式,应将这一比率设为1,这造成了滤波器的非线性。当然也可以允许负数灰度的出现最后进行标定,但是会损失图像的动态范围。

自适应中值滤波器

  中值滤波器只要脉冲噪声的空间密度不大,性能就会很好;自适应中值滤波器可以处理具有更大概率的脉冲噪声,它的优点在于平滑非脉冲噪声时试图保留细节。

  考虑如下符号:

  • python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_92中最小灰度值
  • python cv2去除气泡和干扰线 opencv去噪处理_方差_93中最大灰度值
  • python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_94中灰度中值
  • python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_95坐标python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_96处的灰度值
  • python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_97所允许的最大尺寸

  自适应中值滤波需要两个进程:

进程A:

  • python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_98
  • python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_99
  • python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_100python cv2去除气泡和干扰线 opencv去噪处理_方差_101,则转到进程B
  • 否则增大窗口尺寸
  • 如果窗口尺寸python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_102,则重复进程A
  • 否则输出python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_103

进程B:

  • python cv2去除气泡和干扰线 opencv去噪处理_opencv_104
  • python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_105
  • 如果python cv2去除气泡和干扰线 opencv去噪处理_数字图像处理_106python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_107,则输出python cv2去除气泡和干扰线 opencv去噪处理_方差_108
  • 否则输出python cv2去除气泡和干扰线 opencv去噪处理_脉冲噪声_103

  该算法有三个目的:去除椒盐/脉冲噪声,平滑其他非脉冲噪声,减少物体边界细化/粗化等失真。

python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_110是否是一个脉冲(黑或白),如果python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_111 ,则不可能是脉冲,这样转到B,看窗口的中心点是否是脉冲,若满足进程中条件说明中心点也不是脉冲,这种情况下算法输出python cv2去除气泡和干扰线 opencv去噪处理_opencv_112,而若进程中两个条件同时,说明像素值是一个极端值,输出python cv2去除气泡和干扰线 opencv去噪处理_python cv2去除气泡和干扰线_110

  如果进程A确实找到了一个脉冲,它会扩大窗口尺寸知道到达最大尺寸,此时不能保证该值不是脉冲。