均值、中值、双边、自适应中值滤波

        均值滤波的一个重要假设就是噪声符合均值为0,方差为任意方差的高斯分布,对模板内部的像素值求平均之后,可以使噪声综合,使中心点的像素值不带有噪声,达到去噪的效果。

        中值滤波主要是因为椒盐噪声的数值要么很大,要么很小,所以椒盐噪声通常不是中值,因此使用中值滤波可以很好的去除椒盐噪声。

        双边滤波:基于高斯滤波的一种改进的方法,能够更好的保护图像的边缘和细节,具体做法是既考虑了空间信息,也考虑了周围像素与中心像素灰度值的信息,即双边滤波的核函数是空间域核与像素范围域核的综合结果,在图像的平坦区域,像素值变化很小,那么像素差值接近于0,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,那么像素差值大,对应的像素范围域权重变大,即使距离远空间域权重小,加上像素域权重总的系数也较大,从而保护了边缘的信息。

        自适应中值滤波:在噪声密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),使用中值滤波的效果不错。但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了。只有增大滤波器窗口尺寸,但是增大滤波器窗口大小会使图像变得模糊。

        使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。

中值滤波定义的一些符号:

        Sxy:滤波器的作用区域,滤波器窗口所覆盖的区域,该区域中心点为图像中第y行第x列个像素点;

        Zmin:Sxy中最小的灰度值;

        Zmax:Sxy中最大的灰度值;

        Zmed:Sxy中所有灰度值的中值;

        Zxy:白哦是图像中第y行第x列个像素点的灰度值;

        Smax:Sxy所允许的最大窗口尺寸;

自适应中值滤波器分为以下两个过程,A和B

A:

  1. A1=Zmed-Zmin
  2. A2=Zmed-Zmax
  3. 如果A1>0且A2<0,则跳转至B
  4. 否则,增大窗口尺寸
  5. 如果增大窗口尺寸<=Smax,则重复A
  6. 否则,直接输出Zmed

B:

  1. B1=Zxy-Zmin
  2. B2=Zxy-Zmax
  3. 如果B1>0且B2<0,则输出Zxy
  4. 否则输出Zmed

自适应中值滤波器的执行流程图如下图所示:

matlab代码如下

%一、用不同方法对图像进行去噪
Image=imread('D:\课程\数字图像处理\课程设计\image\lena.bmp');
%1、添加噪声
%添加椒盐噪声
noiseI_sp=imnoise(Image,'salt & pepper',0.6);
%添加方差为0.02的高斯噪声
noiseVariance=0.02;
noiseI_gaussian=imnoise(Image,'gaussian',0,noiseVariance);

%2、去除高斯噪声
%用均值滤波去除高斯噪声
avg_filter_template=1.0/10*[1,1,1;1,2,1;1,1,1];
avg_filter_image=myMeanFilter(noiseI_gaussian,avg_filter_template);
avg_filter_image=uint8(avg_filter_image);
%用中值滤波去除高斯噪声
median_filter_image=myMedianFilter(noiseI_gaussian,3);
median_filter_image=uint8(median_filter_image);
%用双边滤波去除高斯噪声
result1=bilateral_filter(noiseI_gaussian);
%自适应中值滤波去除高斯噪声
median_filter_image1=adp_median(noiseI_gaussian,7);

%3、去除椒盐噪声
%用均值滤波去除椒盐噪声
avg_filter_image1=myMeanFilter(noiseI_sp,avg_filter_template);
avg_filter_image1=uint8(avg_filter_image1);
%用中值滤波去除椒盐噪声
median_filter_image2=myMedianFilter(noiseI_sp,3);
median_filter_image2=uint8(median_filter_image2);
%用双边滤波去除椒盐噪声
result2=bilateral_filter(noiseI_sp);
%自适应中值滤波去除椒盐噪声
median_filter_image3=adp_median(noiseI_sp,15);

%显示
figure;
axis tight;
subplot(3,4,1);imshow(Image);title("原图");
subplot(3,4,2);imshow(noiseI_gaussian);title("高斯噪声图像");
subplot(3,4,3);imshow(noiseI_sp);title("椒盐噪声图像");

subplot(3,4,5);imshow(avg_filter_image);title("均值滤波去除高斯噪声");
subplot(3,4,6);imshow(median_filter_image);title("中值滤波去除高斯噪声");
subplot(3,4,7);imshow(result1);title("双边滤波去除高斯噪声");
subplot(3,4,8);imshow(median_filter_image1);title("自适应中值滤波去除高斯噪声");

subplot(3,4,9);imshow(avg_filter_image1);title("均值滤波去除椒盐噪声");
subplot(3,4,10);imshow(median_filter_image2);title("中值滤波去除椒盐噪声");
subplot(3,4,11);imshow(result2);title("双边滤波去除椒盐噪声");
subplot(3,4,12);imshow(median_filter_image3);title("自适应中值滤波去除椒盐噪声");

%自编均值滤波
function result=myMeanFilter(inputImage,template)
    [row,col]=size(inputImage);
    [t_row,t_col]=size(template);
    result=zeros(row,col);
    padding=floor(t_row/2);
    new_inputImage=zeros(row+padding*2,col+padding*2);
    new_inputImage(1+padding:row+padding*2-padding,1+padding:col+padding*2-padding)=inputImage(:,:);
    for i=1+padding:row+padding*2-padding
        for j=1+padding:col+padding*2-padding
            window=new_inputImage(i-padding:i+padding,j-padding:j+padding);
            result(i-padding,j-padding)=sum(sum(window.*template));
        end
    end
end

%自编中值滤波
function result=myMedianFilter(inputImage,template_size)
    [row,col]=size(inputImage);
    result=zeros(row,col);
    padding=floor(template_size/2);
    new_inputImage=zeros(row+padding*2,col+padding*2);
    new_inputImage(1+padding:row+padding*2-padding,1+padding:col+padding*2-padding)=inputImage(:,:);
    for i=1+padding:row-padding
        for j=1+padding:col-padding
            window=new_inputImage(i-padding:i+padding,j-padding:j+padding);
            result(i,j)=median(window(:));
        end
    end
end

%双边滤波
function result1=bilateral_filter(inputImage)
result=im2double(inputImage);
w=15;sigma_s=6;sigma_r=0.1;
[X,Y]=meshgrid(-w:w,-w:w);
Gs=exp(-(X.^2+Y.^2)/(2*sigma_s^2));
[hm,wn]=size(result);
result1=zeros(hm,wn);
for i=1:hm
    for j=1:wn
        temp=result(max(i-w,1):min(i+w,hm),max(j-w,1):min(j+w,wn));
        Gr=exp(-(temp-result(i,j)).^2/(2*sigma_r^2));
        W=Gr.*Gs((max(i-w,1):min(i+w,hm))-i+w+1,(max(j-w,1):min(j+w,wn))-j+w+1);
        result1(i,j)=sum(W(:).*temp(:))/sum(W(:));
    end
end
end

%自适应中值滤波
function II=adp_median(I,Smax)
%自适应中值滤波
if (Smax<=1)||(Smax/2==round(Smax/2))||(Smax~=round(Smax))%Smax约束,噪声密度越大,Smax应当设置越高
    error('Smax must be an odd integer >1');
end
%初始化
II=I;
II(:)=0;
alreadyProcessed=false(size(I));
%迭代
for k=3:2:Smax
    zmin=ordfilt2(I,1,ones(k,k),'symmetric');
    zmax=ordfilt2(I,k*k,ones(k,k),'symmetric');
    zmed=medfilt2(I,[k k],'symmetric');
    %A1=Zmed-Zmin,A2=Zmed-Zmax
    %如果A1>0且A2<0,则跳转到B
    PA=(zmed>zmin)&(zmax>zmed)&(~alreadyProcessed);%需要转到B步骤的像素
    %B1=Zxy-Zmin,B2=Zxy-Zmax
    %如果B1>0,B2<0,则输出Zxy,否则,输出Zmed
    PB=(I>zmin)&(zmax>I);
    outputZxy=PA&PB;%满足步骤A,B的输出原值对应的像素位置
    outputZmed=PA&~PB;%满足A,不满足B的输出中值对应的像素位置
    II(outputZxy)=I(outputZxy);
    II(outputZmed)=zmed(outputZmed);
    alreadyProcessed=alreadyProcessed|PA;%处理过的像素
    if all(alreadyProcessed(:))
        break;
    end
end
II(~alreadyProcessed)=zmed(~alreadyProcessed);%超过窗口大小没被处理的像素位置 输出原值
end

 运行结果及分析

利用均值滤波器、中值滤波器、双边滤波器、自适应中值滤波器去除高斯噪声和椒盐噪声,运行结果如下:

椒盐噪声概率为0.9时,简单均值滤波无法去除噪声,而自适应中值滤波则可以去除很多噪声,但是不能完全去除。其实不能完全去除的原因是在代码中限制了中值滤波模板尺寸不能超过7,因为模板尺寸太大,图像会变得很模糊,已经失去了使用价值。

接下来椒盐噪声概率为0.6,结果如下:

简单均值滤波去除噪声效果不好,而自适应中值滤波可以去除噪声。

对于高斯噪声来说,中值滤波不可以去除高斯噪声,均值滤波可以可以去除高斯噪声,但是图片会变得模糊;双边滤波可以去除高斯噪声,而且可以更好的保留边缘信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值