十种滤波器的matlab实现

文章概要

      • 1) 产生噪声
      • 2) 均值滤波器
      • 3) 统计排序滤波器
      • 4) 自适应滤波器

1) 产生噪声

  • 构造函数addSaltNoise.m,接受参数snr为图像信噪比,为实验用图test.tif增加椒盐噪声

    % addSaltNoise.m
    function [sImg] = addSaltNoise(snr)
    img=imread('test.tif');
    [imgH,imgW]=size(img);
    sImg=img;
    % 根据图像信噪比产生噪声点数量
    sp=imgH*imgW;
    np=sp*(1-snr);
    % 随机行列,给图像添加噪声for i=1:npx=uint32(rand()*imgH);y=uint32(rand()*imgW);if x && yr=rand()>0.5;if rsImg(x,y)=0;elsesImg(x,y)=255;endendendsubplot(1,2,1);imshow(img),title('原始图像'); subplot(1,2,2);imshow(sImg),title('信噪比为0.5的椒盐噪声图像'); 
    end
    

    信噪比为0.5时的椒盐噪声图像,如下图所示:

    QeSmIf.png

  • 构造函数addGaussianNoise.m,接受参数avg为均值,std为标准差,为实验用图test.tif增加高斯噪声

    % addGaussianNoise.m
    function [gImg] = addGaussianNoise(avg,std)
    img=imread('test.tif');
    [imgH,imgW]=size(img);
    % 产生和图像维度相同的噪声,叠加到图像上
    gImg=uint8((double(img)/255+avg+std*randn(imgH,imgW))*255);
    % subplot(1,2,1);
    % imshow(img),title('原始图像'); 
    % 
    % subplot(1,2,2);
    % imshow(gImg),title('均值为'+string(avg)+'标准差为'+string(std)+'的高斯噪声图像'); 
    

    产生的高斯噪声效果如下图

    在这里插入图片描述

2) 均值滤波器

  • 算术均值滤波器

    编写函数meanValueFilter.m,参数fsize为滤波器大小

    % meanValueFilter.m
    function []=meanValueFilter(fsize)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sNewImg(i,j)=sum(sTemp(:))/numel(sTemp);gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gNewImg(i,j)=sum(gTemp(:))/numel(gTemp);end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('均值滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('均值滤波器处理后图像');
    end
    

    大小为3x3的算术均值滤波器处理椒盐噪声结果

    QeNt7d.png

    大小为3x3的算术均值滤波器处理高斯噪声结果

    在这里插入图片描述

  • 几何均值滤波器

    编写函数geometricMeanFilter.m,参数fsize为滤波器大小

    function []=geometricMeanFilter(fsize)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sNewImg(i,j)=prod(prod(sTemp(:)))^(1/numel(sTemp)); gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gNewImg(i,j)=prod(prod(gTemp(:)))^(1/numel(gTemp)); end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('几何均值滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('几何均值滤波器处理后图像');
    end
    

    大小为3x3的几何均值滤波器处理椒盐噪声结果

    Qedukj.png

    大小为3x3的几何均值滤波器处理高斯噪声结果

    QedKts.png

  • 谐波均值滤波器

    编写函数harmonicMeanFilter.m,参数fsize为滤波器大小

    function []=harmonicMeanFilter(fsize)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sTemp=1./sTemp;sNewImg(i,j)=numel(sTemp)/sum(sTemp(:));gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gTemp=1./gTemp;gNewImg(i,j)=numel(gTemp)/sum(gTemp(:));end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('谐波均值滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('谐波均值滤波器处理后图像');
    end
    

    大小为3x3的谐波均值滤波器处理椒盐噪声结果

    Qe0AeS.png

    大小为3x3的谐波均值滤波器处理高斯噪声结果

    Qe0FL8.png

  • 逆谐波均值滤波器

    编写函数inverseHarmonicMeanFilter.m,参数fsize为滤波器大小,q为阶数

    function []=inverseHarmonicMeanFilter(fsize,q)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = double (sImg(i-flength:i+flength,j-flength:j+flength));sNewImg(i,j)=sum(sTemp(:).^(q+1))/sum(sTemp(:).^(q));gTemp = double (gImg(i-flength:i+flength,j-flength:j+flength));gNewImg(i,j)=sum(gTemp(:).^(q+1))/sum(gTemp(:).^(q));end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('逆谐波均值滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('逆谐波均值滤波器处理后图像');
    end
    

    大小为3x3,阶数为1.5的逆谐波均值滤波器处理椒盐噪声结果

    QeDgMt.png

    大小为3x3,阶数为1.5的逆谐波均值滤波器处理高斯噪声结果

    在这里插入图片描述

3) 统计排序滤波器

  • 中值滤波器

    编写函数middleFilter.m,参数fsize为滤波器大小

    function []=middleFilter(fsize)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sTemp = sort(sTemp(:));sNewImg(i,j)=sTemp((numel(sTemp)-1)/2);gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gTemp = sort(gTemp(:));gNewImg(i,j)=gTemp((numel(gTemp)-1)/2);end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('中值滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('中值滤波器处理后图像');
    end
    

    大小为3x3的中值滤波器处理椒盐噪声结果

    QeHpM6.png

    大小为3x3的中值滤波器处理高斯噪声结果

    Qe7zxx.png

  • 最大值和最小值滤波器

    • 最大值滤波器

      编写函数maxFilter.m,参数fsize为滤波器大小

      function []=maxFilter(fsize)
      % 获取信噪比为0.5的椒盐噪声图像
      sImg = addSaltNoise(0.5);
      % 获取均值为0,标准差为0.1的高斯噪声图像
      gImg = addGaussianNoise(0,0.1);
      [imgH,imgW]=size(sImg);
      sNewImg=sImg;
      gNewImg=gImg;
      % 根据滤波器尺寸计算半长
      if mod(fsize,2)flength = (fsize-1)/2;
      elseflength = fsize/2;
      end
      % 处理图像,结果分别保存在sNewImg和gNewImg
      for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sNewImg(i,j)= max(sTemp(:));gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gNewImg(i,j)=max(gTemp(:));end
      end
      subplot(1,2,1);
      imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
      imshow(sNewImg),title('最大值滤波器处理后图像'); 
      figure();
      subplot(1,2,1);
      imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
      imshow(gNewImg),title('最大值滤波器处理后图像');
      end
      

      大小为3x3的最大值滤波器处理椒盐噪声结果

      QejKLq.png

      大小为3x3的最大值滤波器处理高斯噪声结果

      Qej8FU.png

    • 最小值滤波器

      编写函数minFilter.m,参数fsize为滤波器大小

      function []=minFilter(fsize)
      % 获取信噪比为0.5的椒盐噪声图像
      sImg = addSaltNoise(0.5);
      % 获取均值为0,标准差为0.1的高斯噪声图像
      gImg = addGaussianNoise(0,0.1);
      [imgH,imgW]=size(sImg);
      sNewImg=sImg;
      gNewImg=gImg;
      % 根据滤波器尺寸计算半长
      if mod(fsize,2)flength = (fsize-1)/2;
      elseflength = fsize/2;
      end
      % 处理图像,结果分别保存在sNewImg和gNewImg
      for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sNewImg(i,j) = min(sTemp(:));gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gNewImg(i,j) = min(gTemp(:));end
      end
      subplot(1,2,1);
      imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
      imshow(sNewImg),title('最小值滤波器处理后图像'); 
      figure();
      subplot(1,2,1);
      imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
      imshow(gNewImg),title('最小值滤波器处理后图像');
      end
      

      大小为3x3的最小值滤波器处理椒盐噪声结果

      QejGYF.png

      大小为3x3的最小值滤波器处理高斯噪声结果

      QejJW4.png

  • 中点滤波器

    编写函数mPointFilter.m,参数fsize为滤波器大小

    function []=mPointFilter(fsize)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthsTemp = sImg(i-flength:i+flength,j-flength:j+flength);sNewImg(i,j) = (min(sTemp(:))+max(sTemp(:)))/2;gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gNewImg(i,j) = (min(gTemp(:))+max(gTemp(:)))/2;end
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('中点滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('中点滤波器处理后图像');
    end
    

    大小为3x3的中点滤波器处理椒盐噪声结果

    QejtSJ.png

    大小为3x3的中点滤波器处理高斯噪声结果

在这里插入图片描述

  • 修正后的阿尔法均值滤波器

    编写函数alphaFilter.m,参数fsize为滤波器大小,d为0-fsize^2之间的数字

    function []=alphaFilter(fsize,d)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = addSaltNoise(0.5);
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = addGaussianNoise(0,0.1);
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end
    if d0sTemp = sImg(i-flength:i+flength,j-flength:j+flength);sTemp = sort(sTemp(:));sTemp=sTemp(d:numel(sTemp)-1);sNewImg(i,j)=sum(sTemp())/numel(sTemp);gTemp = gImg(i-flength:i+flength,j-flength:j+flength);gTemp = sort(gTemp(:));gTemp=gTemp(d:numel(gTemp)-1);gNewImg(i,j)=sum(gTemp())/numel(gTemp);endendend
    elsefprintf("d请传入0-fsize^2之间的数!");
    end
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('修正后的阿尔法滤波器处理后图像'); 
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('修正后的阿尔法滤波器处理后图像');
    end
    

    大小为3x3的修正后的阿尔法均值滤波器(d=1)处理椒盐噪声结果

    QejQe0.png

    大小为3x3的修正后的阿尔法均值滤波器(d=1)处理高斯噪声结果

    Qej1oT.png

4) 自适应滤波器

  • 自适应滤波器

    编写函数alphaFilter.m,参数fsize为滤波器大小

    function []=adaptFilter(fsize)
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = double(addGaussianNoise(0,0.1));
    [imgH,imgW]=size(gImg);
    gNewImg = gImg;
    % 根据滤波器尺寸计算半长
    if mod(fsize,2)flength = (fsize-1)/2;
    elseflength = fsize/2;
    end% 处理图像,结果保存在gNewImgfor i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthgTemp = gImg(i-flength:i+flength,j-flength:j+flength);avg = mean(gTemp(:));v = var(gTemp(:));gNewImg(i,j)=gImg(i,j)-255*255*0.01/v*(gImg(i,j)-avg);endend
    gImg = uint8(gImg);
    gNewImg=uint8(gNewImg);
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('自适应滤波器处理后图像');
    end
    

    大小为7x7的自适应滤波器处理,方差为6502.5的高斯噪声结果

在这里插入图片描述

  • 自适应中值滤波器

    编写函数alphaFilter.m,参数fmax为滤波器最大尺寸

    function []=adaptMiddleFilter(fmax)
    % 获取信噪比为0.5的椒盐噪声图像
    sImg = double(addSaltNoise(0.5));
    % 获取均值为0,标准差为0.1的高斯噪声图像
    gImg = double(addGaussianNoise(0,0.1));
    [imgH,imgW]=size(sImg);
    sNewImg=sImg;
    gNewImg=gImg;
    % 计算滤波器最大半长
    if mod(fmax,2)flength = (fmax-1)/2;
    elseflength = fmax/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    % zmax为s区域中的灰度最大值
    % zmin为s区域中的灰度最小值
    % zmed为s区域中的灰度中间值for i=1+flength:imgH-flengthfor j=1+flength:imgW-flengthlen = 1;while len<=flengthsTemp = sImg(i-len:i+len,j-len:j+len);sTemp=sort(sTemp(:));zsmed=sTemp((numel(sTemp)-1)/2);zsmin=min(sTemp);zsmax=max(sTemp);ag1 = zsmed-zsmin;ag2 = zsmed-zsmax;if ag1>0 && ag2<0break;else len=len+1;endendif len==flength+1sNewImg(i,j)=sImg(i,j);elsebs1=sImg(i,j)-zsmin;bs2=sImg(i,j)-zsmax;if bs1>0 && bs2<0sNewImg(i,j)=sImg(i,j);elsesNewImg(i,j)=zsmed;endendlen = 1;while len<=flengthgTemp = gImg(i-len:i+len,j-len:j+len);gTemp=sort(gTemp(:));zgmed=gTemp((numel(gTemp)-1)/2);zgmin=min(gTemp);zgmax=max(gTemp);ag1 = zgmed-zgmin;ag2 = zgmed-zgmax;if ag1>0 && ag2<0break;else len=len+1;endendif len==flength+1gNewImg(i,j)=gImg(i,j);elsebg1=gImg(i,j)-zgmin;bg2=gImg(i,j)-zgmax;if bg1>0 && bg2<0gNewImg(i,j)=gImg(i,j);elsegNewImg(i,j)=zgmed;endendendend
    % 处理完后转化为uint8
    sImg=uint8(sImg);
    sNewImg=uint8(sNewImg);
    subplot(1,2,1);
    imshow(sImg),title('椒盐噪声图像'); subplot(1,2,2);
    imshow(sNewImg),title('自适应中值滤波器处理后图像');
    gImg=uint8(gImg);
    gNewImg=uint8(gNewImg);
    figure();
    subplot(1,2,1);
    imshow(gImg),title('高斯噪声图像'); subplot(1,2,2);
    imshow(gNewImg),title('自适应中值滤波器处理后图像');
    end
    

    最大尺寸为7x7的自适应滤波器处理椒盐噪声结果

    Qm0kHU.png

    最大尺寸为7x7的自适应滤波器处理高斯噪声结果

    Qm0EEF.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部