[db:标题]
摘要:去除椒盐噪音或脉冲噪音最经典的算法是中值滤波,通常在噪声的密度不是很大的情况下,使用中值效果不错。但当概率较大时,普通中值已经难以胜任,此时自适应中值滤波的处理效果简直就是逆天,基本完美的复现了原图,有的时候我自己都不敢相信这个结果,而保守
这两个滤波器也是很久前就看过的,最近偶然翻起那本比较经典的matlab数字图像处理(冈萨雷斯)书,里面也提到了这个算法,觉得效果还行,于是也还是稍微整理下。
为了自己随时翻资料舒服和省事省时,这个算法的原理我们还是把他从别人的博客里搬过来吧:
摘自:图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
自适应的中值滤波器也需要一个矩形的窗口Sxy,和常规中值滤波器不同的是这个窗口的大小会在滤波处理的过程中进行改变(增大)。需要注意的是,滤波器的输出是一个像素值,该值用来替换点(x,y)处的像素值,点(x,y)是滤波窗口的中心位置。
原理说明
过程A的目的是确定当前窗口内得到中值Zmed是否是噪声。如果Zmin<Zmed<Zmax,则中值Zmed不是噪声,这时转到过程B测试,当前窗口的中心位置的像素Zxy是否是一个噪声点。如果Zmin<Zxy<Zmax,则Zxy不是一个噪声,此时滤波器输出Zxy;如果不满足上述条件,则可判定Zxy是噪声,这是输出中值Zmed(在A中已经判断出Zmed不是噪声)。
如果在过程A中,得到则Zmed不符合条件Zmin<Zmed<Zmax,则可判断得到的中值Zmed是一个噪声。在这种情况下,需要增大滤波器的窗口尺寸,在一个更大的范围内寻找一个非噪声点的中值,直到找到一个非噪声的中值,跳转到B;或者,窗口的尺寸达到了最大值,这时返回找到的中值,退出。
从上面分析可知,噪声出现的概率较低,自适应中值滤波器可以较快的得出结果,不需要去增加窗口的尺寸;反之,噪声的出现的概率较高,则需要增大滤波器的窗口尺寸,这也符合种中值滤波器的特点:噪声点比较多时,需要更大的滤波器窗口尺寸。
摘抄完成..............................................
这个过程理解起来也不是很困难,图像处理基础(2):自适应中值滤波器(基于OpenCV实现)这个博客也给出了参考代码,不过我很遗憾的告诉大家,这个博客的效果虽然可以,但是编码和很多其他的博客一样,是存在问题的。
核心在这里:
for (int j = maxSize / 2; j < im1.rows - maxSize / 2; j++)
{
for (int i = maxSize / 2; i < im1.cols * im1.channels() - maxSize / 2; i++)
{
im1.at<uchar>(j, i) = adaptiveProcess(im1, j, i, minSize, maxSize);
}
}
他这里的就求值始终是对同一份图,这样后续的处理时涉及到的领域实际上前面的部分已经是被修改的了,不符合真正的原理的。 至于为什么最后的结果还比较合适,那是因为这里的领域相关性不是特别强。
我这里借助于最大值和最小值滤波以及中值滤波,一个简单的实现如下所示:
/// <summary>
/// 实现图像的自使用中值模糊。更新时间2015.3.11。
/// 参考:Adaptive Median Filtering Seminar Report By: PENG Lei (ID: 03090345)
/// </summary>
/// <param name="Src">需要处理的源图像的数据结构。</param>
/// <param name="Dest">保存处理后的图像的数据结构。</param>
/// <param name="Radius">滤波的半径,有效范围[1,127]。</param>
/// <remarks> 1: 能处理8位灰度和24位及32位图像。</remarks>
/// <remarks> 2: 半径大于10以后基本没区别了。
