中值滤波器

更新时间:2022-08-25 15:50

中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。

技术介绍

在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪。中值滤波是图像处理中的一个常用步骤,它对于斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise)来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。

例子

为了演示中值滤波器的工作过程,我们给下面的数组加上观察窗3,重复边界的数值:

x=[28063]。

所以,中值滤波输出信号y将是:

y[1]=Median[2280]=2,

y[2]=Median[2806]=Median[2680]=6,

y[3]=Median[8063]=Median[3680]=6,

y[4]=Median[633]=Median[336]=3,

于是y=[2663],其中y是x的中值滤波输出。

算法描述

中值滤波器的主要思想是通过入口来遍历信号入口,用邻居入口的中值替换每个入口。邻居的模式被称为“窗口”,它通过入口滑动,覆盖整个信号。对于一维信号,最明显的窗口只是前后几项,而2D(或更高维)信号(如图像)则可能有更复杂的窗口模式(如“盒子”或“十字”模式)。请注意,如果窗口中有奇数个条目,则中位数很容易定义:在窗口中的所有条目都按数字排序之后,这只是中间值。对于偶数的条目,有不止一个可能的中位数。

边界问题

请注意,在上面的例子中,因为第一个值之前没有条目,所以第一个值和最后一个值一样重复,以获得足够的条目来填充窗口。这是在信号边界处理丢失的窗口条目的一种方法,但是还有其他的方案具有不同的属性,在特定情况下可能是优选的:

二维中值过滤伪代码

简单的二维中值滤波算法代码可能如下所示:

allocateoutput PixelValue[imagewidth][imageheight]

allocatewindow[windowwidth*windowheight]

edgex:=(windowwidth/2)roundeddown

edgey:=(windowheight/2)roundeddown

forxfromedgextoimagewidth-edgex

foryfromedgeytoimageheight-edgey

i=0

forfxfrom0towindowwidth

forfyfrom0towindowheight

window[i]:=input PixelValue[x+fx-edgex][y+fy-edgey]

i:=i+1

sortentriesinwindow[]

output PixelValue[x][y]:=window[windowwidth*windowheight/2]

请注意,这个算法:

算法实现问题

通常,大部分的计算工作和时间花费在计算每个窗口的中值上。由于滤波器必须处理信号中的每个条目,对于像图像这样的大信号,这个中值计算的效率是确定算法运行速度的关键因素。上面描述的天真的实现将窗口中的每个条目进行排序以找到中间值;然而,由于只需要列表中的中间值,所以选择算法可以更有效。此外,某些类型的信号(通常是图像的情况)使用整数表示:在这些情况下,直方图因为从窗口到窗口更新直方图是简单的,并且找到直方图的中值并不特别繁琐,所以中值可以更有效得多。

边缘保存属性

中值滤波是一种平滑技术,与线性高斯滤波一样。所有的平滑技术都能有效去除信号光滑区域或平滑区域的噪声,但对边缘产生不利影响。通常,在减少信号中的噪声的同时,保持边缘是重要的。例如,边缘对于图像的视觉外观是至关重要的。对于(高斯)噪声的小至中等水平,中值滤波器在消除噪声方面明显好于高斯模糊,同时为给定的固定窗口大小保留边缘。然而,对于高噪声,其性能并不比高斯模糊好,而对于散斑噪声和椒盐噪声(冲动噪音),这是特别有效的。因此,中值滤波在数字图像处理中被广泛使用。

在GIMP中进行中值滤波

在GIMP2.8.2中操作如下:

滤镜->增强->去除斑点。

不要勾选适应和递归,设置黑色水平为-1,白色水平为256。根据需要调节半径。半径越大,细节越少。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}