数字图像处理---自适应中值滤波实验(MATLAB实现含源码)

自适应中值滤波实验(MATLAB实现)

【实验目的】

1、 掌握中值滤波以及自适应中值滤波器的原理以及滤波过程
2、 掌握自适应中值滤波的算法设计
3、 进一步熟悉MATLAB编程

【实验原理】

中值滤波的思想就是比较一定领域内的像素值的大小,取出其中值作为这个领域的中心像素新的值。假设对一定领域内的所有像素从小到大进行排序,如果存在孤立的噪声点,比如椒盐噪声,那么从小到大排序的这个数组中,那些孤立的噪声一定会分布在两边,这样子取出的中值点可以很好地保留像素信息,而滤除了噪声点的影响。
中值滤波器受滤波窗口尺寸大小影响较大,用于消除噪声和保护图像细节,两者会存在冲突。如果窗口较小,则能较好地保护图像中的一些细节信息,但对噪声的过滤效果就会打折扣;反之,如果窗口尺寸较大则会有较好的噪声过滤效果,但也会对图像造成一定的模糊效果,从而丢失一部分细节信息。
使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。
自适应中值滤波器有三个目的:
(1) 滤除椒盐噪声
(2) 平滑其他非脉冲噪声
(3) 尽可能的保护图像中图像的点、线等细节及边界信息,避免图像边缘的细化或者粗化。
(4) 当检测到的噪声不是很强时,就不用增加窗口的大小,既体现出自适应性,又减少了时间开销,提高了速度。

【实验内容】

对一幅灰度图像I(x,y):
(1) 对I(x,y)添加椒盐噪声;
(2) 分别画出原图和加噪后的图像;
(3) 用自适应中值滤波和传统中值滤波分别椒盐噪声图进行滤波处理,并进行比较。

【实验结果分析】

对图像进行了边缘填充,所以图像边缘多出来的区域也做了中值滤波处理,边缘噪声小。无论是中值滤波还是自适应中值滤波,都能过滤掉图像中的噪声,自适应中值滤波器的效果要好些,中值滤波器还有一些噪声没有过滤掉。而且,传统的中值滤波器对图像造成的模糊较明显,而自适应中值滤波器很好的保存了图像中的细节。如图一所示:
在这里插入图片描述
**对于n次传统中值滤波器来说,图像去除椒盐噪声的效果更好,但是图像更加模糊平滑。**如图二所示:
在这里插入图片描述

【实验代码】

clc;
I=imread('15.jpg');
I=rgb2gray(I);
I_noise = imnoise(I,'salt & pepper', 0.25);
subplot(231),imshow(I),xlabel("原始图像");
subplot(232),imshow(I_noise),xlabel("受椒盐噪声干扰的图像");
[Im,In]=size(I_noise);
nmin = 3;
nmax = 7;
I_out = I_noise;
%% 边界扩充
I_ex = [zeros((nmax-1)/2,In+(nmax-1));zeros(Im,(nmax-1)/2),I_noise,zeros(Im,(nmax-1)/2);zeros((nmax-1)/2,In+(nmax-1))];
%% 自适应中值滤波
for x =1:Im
    for y = 1:In
        for n = nmin:2:nmax
            Sxy = I_ex(x+(nmax-1)/2-(n-1)/2:x+(nmax-1)/2+(n-1)/2,y+(nmax-1)/2-(n-1)/2:y+(nmax-1)/2+(n-1)/2);
            Smin = min(min(Sxy));
            Smax = max(max(Sxy));
            Smed = median(median(Sxy));
            if Smed > Smin && Smed < Smax                              
                if I_out(x,y) <= Smin || I_out(x,y) >= Smax                                     
                    I_out(x,y) = Smed;                 
                end
                break             
            end
        end     
        I_out(x,y) = Smed;   
    end
end
subplot(233),imshow(I_out),xlabel('尺寸大小为7的中值滤波效果')

%% 传统中值滤波器
Iout = medfilt2(I_noise,[3 3]);
subplot(234),imshow(Iout),xlabel('尺寸为3*3的一次中值滤波')
Iout_1 = medfilt2(Iout,[3 3]);
subplot(235),imshow(Iout_1),xlabel('尺寸为3*3的二次中值滤波')
Iout_2 = medfilt2(Iout_1,[3 3]);
subplot(236),imshow(Iout_2),xlabel('尺寸为3*3的三次中值滤波')

猜你喜欢

转载自blog.csdn.net/weixin_45818370/article/details/124654001
今日推荐