Matlab---图像滤波之各种滤波器汇总实现

来源:互联网 发布:python 最小化到托盘 编辑:程序博客网 时间:2024/05/22 12:55

1 打开图片

  所有的滤波原始图片均使用下面的操作方式打开(只处理灰度图像):

    % 读取图像 可以处理彩色多通道图片(转化为灰度图像)           [FileName,PathName,FilterIndex] = uigetfile({'*.png;*.jpg;*.jpeg';'*.*'},'选择一幅待处理图片');    filename = fullfile(PathName, FileName) ;        SrcImg = imread(filename);         % setappdata(0,'SrcData',SrcImg);    % 获取图像的信息        [m n channels] = size(SrcImg);     if(channels > 1)        % 将彩色图象转为灰度图像        SrcImg = rgb2gray(SrcImg);        % 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声        setappdata(0,'SrcImg',SrcImg);        imshow(SrcImg);            else        % 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声        setappdata(0,'SrcImg',SrcImg);        imshow(SrcImg);            end       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2 创建我们需要的噪声

  对原始图像进行加噪声处理,即操作SrcImg

    % 获取原始图像数据    SrcImg = getappdata('SrcImg');    % 变换    f = mat2gray(SrcImg,[0 255]);    % 获取图像大小信息    [M,N] = size(f);    %% 高斯噪声    a = 0;    b = 0.08;    n_gaussian = a + b .* randn(m,n);    g_gaussian = f + n_gaussian;      % show image    figure();        imshow(g_gaussian,[0 1]);    % 保存图片    imwrite(g_gaussian,'gaussianNoise.jpg','jpg');    xlabel('Ruselt of Gaussian noise');         %% 瑞利噪声    a = -0.2;      b = 0.03;      n_rayleigh = a + (-b .* log(1 - rand(M,N))).^0.5;       g_rayleigh = f + n_rayleigh;     % show image    figure();        imshow(g_rayleigh,[0 1]);    imwrite(g_rayleigh,'rayleighNoise.jpg','jpg');    xlabel('Ruselt of rayleigh noise');            %% 伽马噪声    a = 25;      b = 3;      n_Erlang = zeros(M,N);       for j=1:b          n_Erlang = n_Erlang + (-1/a)*log(1 - rand(M,N));      end        g_Erlang = f + n_Erlang;     % show image    figure();        imshow(g_Erlang,[0 1]);    imwrite(g_Erlang,'erlangNoise.jpg','jpg');    xlabel('Ruselt of erlang noise');         %% 均匀噪声    a = 0;      b = 0.3;      n_Uniform = a + (b-a)*rand(M,N);     g_Uniform = f + n_Uniform;    % show image    figure();        imshow(g_Uniform,[0 1]);    imwrite(g_Uniform,'uniformNoise.jpg','jpg');    xlabel('Ruselt of uniform noise');             %% 椒盐噪声    a = 0.05;      b = 0.05;      x = rand(M,N);      g_sp = zeros(M,N);      g_sp = f;      g_sp(find(x<=a)) = 0;      g_sp(find(x > a & x<(a+b))) = 1;        % show image    figure();        imshow(g_sp,[0 1]);    imwrite(g_sp,'saltNoise.jpg','jpg');    xlabel('Ruselt of salt pepper noise');     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

  加噪结果:

原始图像:
  • 1
  • 2

原始图像

椒盐噪声:
  • 1
  • 2

椒盐噪声

高斯噪声:
  • 1
  • 2

高斯噪声

均匀噪声:
  • 1
  • 2

均匀噪声

伽马噪声:
  • 1
  • 2

伽马噪声

瑞利噪声:
  • 1
  • 2

瑞利噪声

3 开始滤波处理(空域和频域)

  开始滤波了,通过上面的创建噪声并保存下了各种噪声的图像,接下来要用各种滤波方式将各种噪声降低,显然先要打开各个噪声图像,打开方式同第一节,这里不对各个滤波方式和原理讲解。

低通滤波:f为加噪图像         
  • 1
  • 2
    f = mat2gray(f,[0 255]);    [M,N] = size(f);    P = 2*M;    Q = 2*N;    fc = zeros(M,N);    for x = 1:1:M        for y = 1:1:N            fc(x,y) = f(x,y) * (-1)^(x+y);        end    end    F = fft2(fc,P,Q);    H_1 = zeros(P,Q);    H_2 = zeros(P,Q);    for x = (-P/2):1:(P/2)-1         for y = (-Q/2):1:(Q/2)-1            D = (x^2 + y^2)^(0.5);            D_0 = 100;            H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);               H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^6);         end    end    G_1 = H_1 .* F;    G_2 = H_2 .* F;    g_1 = real(ifft2(G_1));    g_1 = g_1(1:1:M,1:1:N);    g_2 = real(ifft2(G_2));    g_2 = g_2(1:1:M,1:1:N);             for x = 1:1:M        for y = 1:1:N            g_1(x,y) = g_1(x,y) * (-1)^(x+y);            g_2(x,y) = g_2(x,y) * (-1)^(x+y);        end    end    %% 显示图像    figure();    imshow(g_2,[0 1]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
高斯平滑:f为加噪图像
  • 1
  • 2
    f=double(f);    f=fft2(f);    f=fftshift(f);    [m,n]=size(f);    d0=80;    m1=fix(m/2);    n1=fix(n/2);    for i=1:m        for j=1:n            d=sqrt((i-m1)^2+(j-n1)^2);            h(i,j)=exp(-d^2/2/d0^2);        end    end    g=f.*h;    g=ifftshift(g);    g=ifft2(g);    g=mat2gray(real(g));    %% 显示图像    figure();    imshow(g);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
自适应中值滤波:f为噪声图像
  • 1
  • 2
    f = mat2gray(f,[0 255]);    [M,N] = size(f);    g_sp = f;    x = linspace(-0.2,1.2,358);    h = hist(g_sp,x)/(M*N);    Histogram = zeros(358,1);    for y = 1:256        Histogram = Histogram + h(:,y);    end    %%     S_max = 7;    w = zeros(S_max,S_max);    w(round(S_max/2),round(S_max/2)) = 1;    g_Ex = imfilter(g_sp,w,'symmetric','full');    g_Admf = zeros(M,N);    S = 3;    for x = 4:M+3        for y = 4:N+3            %  A            for S = 3:2:S_max                S_xy = zeros(S,S);                for s = 1:1:S                    for t = 1:1:S                        S_xy(s,t) = g_Ex(x+s-round(S/2),y+t-round(S/2));                    end                end                 z_min = min(S_xy(:));                z_max = max(S_xy(:));                z_med = median(S_xy(:));                A_1 = z_med - z_min;                A_2 = z_med - z_max;                if ((A_1>0)&&(A_2<0))                 % B                   B_1 = g_Ex(x,y) - z_min;                  B_2 = g_Ex(x,y) - z_max;                  if((B_1>0)&&(B_2<0)) g_Admf(x-3,y-3) = z_med;break;                  else g_Admf(x-3,y-3) = z_med; break;                  end                  end                if(S >= S_max)  g_Admf(x-3,y-3) = z_med; break;                end            end            end    end    %% 显示结果    figure();    imshow(g_Admf,[0,1]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
维纳滤波:
  • 1
  • 2
    afterFilter = wiener2(f,[7 7]);        figure();    imshow(afterFilter);
  • 1
  • 2
  • 3
最大值滤波、中值滤波、最小值滤波:调节参数即可,5相当于中值滤波
  • 1
  • 2
    afterFilter = ordfilt2(f,5,ones(3,3));    figure();    imshow(afterFilter);        复合滤波:       ```matlab    afterFilter1 = ordfilt2(f,5,ones(3,3));    h_gaosi1=fspecial('gaussian',3,1);    afterFilter2 = imfilter(afterFilter1,h_gaosi1);    afterFilter3 = wiener2(afterFilter2,[7 7]);    figure();    imshow(afterFilter3);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

部分结果: 
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击