十种滤波器的matlab实现

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:np
            x=uint32(rand()*imgH);
            y=uint32(rand()*imgW);
            if x && y
                r=rand()>0.5;
                if r
                    sImg(x,y)=0;
                else
                    sImg(x,y)=255;
                end
            end
        end
        subplot(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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
      else
          flength = fsize/2;
      end
      % 处理图像,结果分别保存在sNewImg和gNewImg
      for i=1+flength:imgH-flength
          for j=1+flength:imgW-flength
              sTemp = 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;
      else
          flength = fsize/2;
      end
      % 处理图像,结果分别保存在sNewImg和gNewImg
      for i=1+flength:imgH-flength
          for j=1+flength:imgW-flength
              sTemp = 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;
    else
        flength = fsize/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    for i=1+flength:imgH-flength
        for j=1+flength:imgW-flength
            sTemp = 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;
    else
        flength = fsize/2;
    end
    if d<fsize*fsize
        % 处理图像,结果分别保存在sNewImg和gNewImg
        for i=1+flength:imgH-flength
            for j=1+flength:imgW-flength
                if d>0
                    sTemp = 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);
                end
            end
        end
    else
        fprintf("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;
    else
        flength = fsize/2;
    end
    
        % 处理图像,结果保存在gNewImg
        for i=1+flength:imgH-flength
            for j=1+flength:imgW-flength
                    gTemp = 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);
            end
        end
    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;
    else
        flength = fmax/2;
    end
    % 处理图像,结果分别保存在sNewImg和gNewImg
    % zmax为s区域中的灰度最大值
    % zmin为s区域中的灰度最小值
    % zmed为s区域中的灰度中间值
        for i=1+flength:imgH-flength
            for j=1+flength:imgW-flength
                len = 1;
                while len<=flength
                        sTemp = 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<0
                        break;
                    else 
                        len=len+1;
                    end
                end
                if len==flength+1
                    sNewImg(i,j)=sImg(i,j);
                else
                    bs1=sImg(i,j)-zsmin;
                    bs2=sImg(i,j)-zsmax;
                    if bs1>0 && bs2<0
                        sNewImg(i,j)=sImg(i,j);
                    else
                        sNewImg(i,j)=zsmed;
                    end
                end
                len = 1;
                while len<=flength
                        gTemp = 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<0
                        break;
                    else 
                        len=len+1;
                    end
                end
                if len==flength+1
                    gNewImg(i,j)=gImg(i,j);
                else
                    bg1=gImg(i,j)-zgmin;
                    bg2=gImg(i,j)-zgmax;
                    if bg1>0 && bg2<0
                        gNewImg(i,j)=gImg(i,j);
                    else
                        gNewImg(i,j)=zgmed;
                    end
                end
            end
        end
    % 处理完后转化为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

发布了8 篇原创文章 · 获赞 0 · 访问量 1680

猜你喜欢

转载自blog.csdn.net/Pure_vv/article/details/103341004