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

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       

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');     

  加噪结果:

原始图像:

Matlab---图像滤波之各种滤波器汇总实现_第1张图片

椒盐噪声:

Matlab---图像滤波之各种滤波器汇总实现_第2张图片

高斯噪声:

Matlab---图像滤波之各种滤波器汇总实现_第3张图片

均匀噪声:

Matlab---图像滤波之各种滤波器汇总实现_第4张图片

伽马噪声:

瑞利噪声:

Matlab---图像滤波之各种滤波器汇总实现_第5张图片

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

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

低通滤波:f为加噪图像         
    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]);
高斯平滑:f为加噪图像
    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);
自适应中值滤波:f为噪声图像
    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]);
维纳滤波:
    afterFilter = wiener2(f,[7 7]);    
    figure();
    imshow(afterFilter);
最大值滤波、中值滤波、最小值滤波:调节参数即可,5相当于中值滤波
    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);

部分结果:
Matlab---图像滤波之各种滤波器汇总实现_第6张图片

Matlab---图像滤波之各种滤波器汇总实现_第7张图片

Matlab---图像滤波之各种滤波器汇总实现_第8张图片

Matlab---图像滤波之各种滤波器汇总实现_第9张图片

Matlab---图像滤波之各种滤波器汇总实现_第10张图片

你可能感兴趣的:(matlab,图像滤波,频域,空域)