十種濾波器的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章