中值滤波(资料整理,持续更新)

中值滤波(Median Filter),用于图像的中值滤波最早是由美国普林斯顿大学的John Wilder Tukey教授提出来的。常见的线性滤波器,用于图像处理时,有可能导致细节模糊或破坏边缘,更关键的是无法滤除脉冲干扰,而中值滤波,作为一种典型的非线性滤波器,则可以较好地解决此类问题。

中值滤波的基本工作原理是基于排序统计理论,把数字图像或数字序列中某一点的值用该点的一个邻域中各点值的中值代替,从而使周围的像素值更接近真实值,达到消除孤立噪声点的目的。实际操作中,中值滤波会选取数字图像或数字序列中像素点及其周围临近像素点(要求奇数个像素点,例如3*3,5*5等)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值,使周围的像素值接近真实值,从而消除孤立的噪声点。下图中取像素点79(红色标示),该像素及邻近像素点3*3,即绿色区域内的像素点。将这些像素点的像素值进行排序,按升序排序后得到序列值为:[68,79,86,89,93,93,93,98,102]。在该序列中,处于中心位置(也叫中心点或中值点)的值是93,以该值替换原来的像素值 79,作为操作点的新像素值。

5 57 23 52 23 59
123 20 64 34 79 66
47 19 98 93 93 26
70 63 93 79 86 175
70 98 68 89 102 199
97 87 88 43 39 120

在OpenCV中,实现中值滤波的函数是cv2.medianBlur(),其语法格式如下:

         dst=cv2.medianBlur(src,ksize)

        dst:返回值,中值滤波结果

        src: 源图像,即需要处理的图像。可以有任意数量的通道,对各个通道独立处理

        ksize:滤波核。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度,核大小必须是比1大的奇数,比如3、5、7等。

对上图进行中值滤波,核为3,结果为:

20 23 52 34 52 59
47 47 52 64 59 59
63 64 64 86 79 79
70 70 89 93 93 102
70 87 87 86 89 120
97 88 87 68 89 120

代码如下:

import cv2
im=cv2.imread("test_m.bmp",0)
im
dst=cv2.medianBlur(im,3)
dst

test_m.bmp文件,即上述原始图像:用于测试中值滤波的demo文件资源-CSDN文库

中值滤波在滤除高斯噪声、随机噪声、“椒盐”噪声及冲击噪声中表现突出。通常中值滤波中的数据排序费时较多,特别在大窗口下,需要进行大量的数据比较工作,不利于图像快速实时的处理。中值滤波算法的复杂度是O(r2logr),其中r为核的半径。当像素的可能取值是个常数时,比如对于8位图像,可以使用桶排序(Bucker sort),该排序使得算法的复杂度降低为O(r2)。但是除了小半径的情况外,这样的改进任然是不可接受的。

传统中值滤波(Standard Median Filter,SM),是通过快速排序寻找像素点集合的中值,该方法对滤波窗口形状和像素灰度级没有限制,具有更加广泛的运用范围。由算法原理可知,传统中值滤波算法的执行效率由快速排序算法的时间复杂度决定, 其基本思想是通过每次排序将像素点集合划分为相互独立的两个子集合, 其中一个子集合中所有像素值都比另一个子集合中所有像素值小, 然后分别对这两个子集合继续进行排序, 直到滤波窗口中所有像素点有序。SM算法最后选取位于序列中间位置的元素作为中值滤波的输出。

加权中值滤波(Weight Median Filter),将窗口内的每一个像素都乘上一个相应的权值,然后利用乘上权值后的值进行排序,取中值替换中心元素的灰度值即可。传统中值滤波可以看做是每个像素的权值都是1的加权中值滤波。加权中值滤波比较耗时,基本是O(r2)的复杂度,在实时性要求比较高的项目中是难以应用的。

自适应中值滤波器(Adaptive Median Filter),在噪声密度不是很大的情况下(根据报道,噪声出现的概率小于20%),使用中值滤波的效果不错。但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了。只有增大滤波器窗口尺寸,尽管会使图像变得模糊。使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。
 

猜你喜欢

转载自blog.csdn.net/weixin_41784968/article/details/129801517