数字图像处理---自适应中值滤波实验(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的三次中值滤波')
  • 3
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB自适应中值滤波的具体步骤如下: 1. 读取需要进行滤波处理的图像。 2. 选择滤波窗口的大小和最大尺寸,设定初始的窗口大小。 3. 对图像进行遍历,对于每个像素点,以该点为中心,提取出当前窗口内的像素值。 4. 计算窗口内像素的中值,以及像素的最大值和最小值。 5. 如果中值不是最大值或最小值,则直接输出该像素点的灰度值。 6. 如果中值是最大值或最小值,则将窗口大小增大一格,继续进行第三步到第五步的操作。 7. 直到窗口大小达到最大尺寸,仍然无法找到合适的中值,则输出当前像素点的灰度值。 8. 输出滤波后的图像。 具体实现代码如下: ``` function [output] = adaptive_median_filter(input, max_window_size) [height, width] = size(input); output = zeros(height, width); for i = 1:height for j = 1:width window_size = 3; while (window_size <= max_window_size) window_half = floor(window_size / 2); window = input(max(1, i - window_half):min(height, i + window_half), ... max(1, j - window_half):min(width, j + window_half)); window_vector = window(:); window_vector_sorted = sort(window_vector); window_min = window_vector_sorted(1); window_max = window_vector_sorted(end); window_median = median(window_vector); if ((window_min < window_median) && (window_median < window_max)) output(i, j) = input(i, j); break; else window_size = window_size + 2; end end if (window_size > max_window_size) output(i, j) = input(i, j); end end end output = uint8(output); end ``` 其中,input为输入的图像,max_window_size为滤波窗口的最大尺寸。函数中采用了while循环,根据当前窗口内像素的中值是否为最大值或最小值,不断调整窗口大小,直到达到最大尺寸而仍然无法找到合适的中值。最后将输出图像转换为uint8类型,以便于显示和保存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值