《数字图像处理》手动实现修正的α均值滤波+手动实现自适应中值滤波器

1 修正的α均值滤波实现

1.1 修正的α均值滤波原理

假设在邻域S_xy内去掉g(x,t)最低灰度值的d/2和最高的灰度值的d/2。令g_r (x,t)代表剩下的mn-d个像素。由这些剩余的像素的平均值形成的滤波器就称为修正的α均值滤波器:
在这里插入图片描述
其中,d的取值范围可以为0到mn-1。当d=0时,修正的α均值滤波器退化为算术均值滤波器。如果选择d=mn-1,则修正的α均值滤波器将退化为中值滤波器。当d取其他值时,修正的α均值滤波器在包括多种噪声的情况下很有用。例如高斯噪声和椒盐噪声混合的情况下。

1.2 实验结果

算法的主要流程比较简单,对于选定邻域的大小后的每一个小区域内的像素根据像素值(这里是灰度值)的大小进行排序,选取提前设定好的最高像素值和最低像素值的界限,将中间的像素值的均值作为邻域中心像素点的像素值(灰度值)即可,这样将整幅图像进行遍历即可得到最终的修正的α均值滤波效果。具体的实验代码及注释见于AlphaTrimmedMeanFt.py文件,具体的实验结果如下所述。
实验图为一个加了高级别噪音(肉眼观察主要为椒噪声和盐噪声)污染后的电路板的图片。下面分别考虑不同邻域大小以及不同的最低灰度值的d/2和最高的灰度值的d/2下的滤波效果。
邻域大小为3×3,最低灰度值d/2和最高的灰度值d/2中的d取值为4的滤波效果:(左图为原图,右图为滤波后的图)(算法三次平均用时2.58秒)
在这里插入图片描述
邻域大小为3×3,最低灰度值d/2和最高的灰度值d/2中的d取值为6的滤波效果:(左图为原图,右图为滤波后的图)(算法三次平均用时2.57秒)
在这里插入图片描述
邻域大小为3×3,最低灰度值d/2和最高的灰度值d/2中的d取值为0的滤波效果(即为算数均值滤波):(左图为原图,右图为滤波后的图)(算法三次平均用时2.86秒)
在这里插入图片描述
邻域大小为3×3,最低灰度值d/2和最高的灰度值d/2中的d取值为8的滤波效果(即为中值滤波):(左图为原图,右图为滤波后的图)(算法三次平均用时2.22秒)
在这里插入图片描述
邻域大小为5×5,最低灰度值d/2和最高的灰度值d/2中的d取值为20的滤波效果:(左图为原图,右图为滤波后的图)(算法三次平均用时6.52秒)

在这里插入图片描述
邻域大小为5×5,最低灰度值d/2和最高的灰度值d/2中的d取值为16的滤波效果:(左图为原图,右图为滤波后的图)(算法三次平均用时6.69秒)
在这里插入图片描述
邻域大小为5×5,最低灰度值d/2和最高的灰度值d/2中的d取值为24的滤波效果(即为中值滤波):(左图为原图,右图为滤波后的图)(算法三次平均用时6.22秒)
在这里插入图片描述

1.3 实验结果分析与结论

首先,使用修正的α均值滤波器可以对较高污染下的椒盐噪声图片,进行很好的滤波。
其次,在实验中我尝试了不同大小的邻域以及不同范围的最低灰度值和最高的灰度值,可以得出这样的结论:
对于不同的邻域值,由于此图细节较多,从实际的实验结果来看,邻域大小为3×3的滤波器的效果更好,可以更好的恢复图片中的细节,对于邻域大小为5×5的滤波器对于噪声的消除的效果更好,但是对于原图的细节恢复的效果没有3×3的滤波器理想。
对于最低灰度值和最高的灰度值的范围来说,从两种不同的邻域的结果来看,选取所有邻域像素数的一半作为此范围的滤波效果是最为理想的。
在时间方面,随着邻域面积的增大,处理时间也将变长,对于最低灰度值和最高的灰度值的范围来说,对于算法运行的时间影响不大。
另外,对于边界一圈的像素值,仅使用修正的α均值滤波器是不可以进行滤波的,所以我在下一个实验中自己设计了算法,进行了边界的过滤,在下一个自适应中值滤波器的效果中可以表现出来。

2 自适应中值滤波器

2.1 自适应中值滤波器原理

在噪声密度不是很大的情况下,使用中值滤波的效果不错。但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了。只有增大滤波器窗口尺寸,尽管会使图像变得模糊。
使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。综上,自适应中值滤波可以处理具有更大概率的脉冲噪声。同时,其可以在平滑非脉冲噪声时保留细节。
考虑下面的符号:
S_xy:滤波器的作用区域,滤波器窗口所覆盖的区域,该区域中心点为图像中第y行第x列个像素点;
Z_min:S_xy中最小的灰度值;
Z_max:S_xy中最大的灰度值;
Z_med:S_xy中所有灰度值的中值;
Z_xy:表示图像中第y行第x列个像素点的灰度值;
S_max:S_xy所允许的最大窗口尺寸;
进程A:
A1 = Z_med-Z_min
A2 = Z_med-Z_max
如果A1>0 且 A2<0则跳转到B
否则,增大窗口的尺寸
如果增大后的尺寸≤S_max,则重复A
否则,直接输出Z_med
进程B:
B1 = Z_xy-Z_min
B2 = Z_xy-Z_max
如果B1>0 且 B2<0,则输出Z_xy
否则输出Z_med
这个的直观解释就是:在自适应中值滤波算法中,A步骤里面会先判断是否满足Z_min<Z_med<Z_max。这一步骤实质是判断当前区域的中值点是否是噪声点,通常来说是满足Z_min<Z_med<Z_max这个条件的,此时中值点不是噪声点,跳转到B;考虑一些特殊情况,如果Z_med=Z_min或Z_med=Z_max,则认为是噪声点,应该扩大窗口尺寸,在一个更大的范围内寻找一个合适的非噪声点,随后再跳转到B,否则输出的中值点是噪声点;
跳转到B之后,判断中心点的像素值是否是噪声点,判断条件为Z_min<Z_xy<Z_max,原理同上,因为如果Z_min=Z_xy或Z_xy=Z_max,则认为是噪声点。如果不是噪声点,我们可以保留当前像素点的灰度值;如果是噪声点,则使用中值替代原始灰度值,滤去噪声。

2.2 实验结果

根据2.1中对于自适应中值滤波器的原理描述,所实现的主要代码如图所示:
在这里插入图片描述
具体的实验代码及注释见于AdaptiveMedianFt.py文件,具体的实验结果如下所述。
实验图为一个加了相比于第一小节更高级别噪音污染后的电路板的图片。下面分别考虑不同最大邻域大小以及不同的初始滤波器大小下的滤波效果。
最大邻域大小为7×7,初始滤波器大小为3×3的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时5.74秒)
在这里插入图片描述
最大邻域大小为7×7,初始滤波器大小为5×5的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时8.85秒)
在这里插入图片描述
最大邻域大小为9×9,初始滤波器大小为3×3的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时6.35秒)
在这里插入图片描述
最大邻域大小为9×9,初始滤波器大小为5×5的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时9.88秒)
在这里插入图片描述
最大邻域大小为13×13,初始滤波器大小为3×3的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时8.32秒)
在这里插入图片描述
最大邻域大小为13×13,初始滤波器大小为5×5的自适应中值滤波的效果:(左图为原图,右图为滤波后的图)(算法三次平均用时11.93秒)
在这里插入图片描述

2.3 实验结果分析与结论

首先,使用自适应中值滤波器可以很好的处理很高噪声污染的图片。在实验中我尝试了不同最大邻域大小以及不同的初始滤波器大小下的自适应中值滤波的效果,可以得出这样的结论:
对于不同的邻域大小来说,这里尝试了7×7、9×9、13×13的邻域大小,结果发现,处理效果均十分理想。仔细对比可以看出,7×7的效果是最好的,尤其在滤波后图片的细节方面可以表现的十分明显。
对于不同的初始滤波器大小来说,这里尝试了3×3、5×5的初始滤波器邻域大小,从两种不同的邻域的结果来看,处理效果也均比较理想。不过仔细观察可以发现,对于本图来说,噪声的密度比较大,所以5×5的大小的效果更好,可以对于更大范围内的噪声进行滤波。
另外,对于边界一圈的像素值,进行了边界的过滤(边缘点的像素值使用与之最近的滤波后的点的像素值替代)。这样可以使图片的边缘变得更加光滑。
在时间方面,随着最大邻域以及初始滤波器边长的增大,处理时间都将明显变长,而且基本呈现线性关系。

猜你喜欢

转载自blog.csdn.net/qq_39867051/article/details/106982126
今日推荐