How to make a Gaussian filter in Matlab

后端 未结 2 1151
轮回少年
轮回少年 2020-12-03 15:50

I have tried to make a Gaussian filter in Matlab without using imfilter() and fspecial(). I have tried this but result is not like the one I have w

相关标签:
2条回答
  • 2020-12-03 16:37

    here's an alternative:

    Create the 2D-Gaussian:

      function f=gaussian2d(N,sigma)
      % N is grid size, sigma speaks for itself
     [x y]=meshgrid(round(-N/2):round(N/2), round(-N/2):round(N/2));
     f=exp(-x.^2/(2*sigma^2)-y.^2/(2*sigma^2));
     f=f./sum(f(:));
    

    Filtered image, given your image is called Im:

     filtered_signal=conv2(Im,gaussian2d(N,sig),'same');
    

    Here's some plots:

    imagesc(gaussian2d(7,2.5))
    

    enter image description here

     Im=rand(100);subplot(1,2,1);imagesc(Im)
     subplot(1,2,2);imagesc(conv2(Im,gaussian2d(7,2.5),'same'));
    

    enter image description here

    0 讨论(0)
  • 2020-12-03 16:42

    This example code is slow because of the for-loops. In matlab you can better use conv2, as suggested by user:bla, or just use filter2.

    I = imread('peppers.png'); %load example data
    I = I(:,:,1);
    N=5; %must be odd
    sigma=1;
    figure(1);imagesc(I);colormap gray
    x=1:N;
    X=exp(-(x-((N+1)/2)).^2/(2*sigma^2));
    h=X'*X;
    h=h./sum(h(:));
    %I=filter2(h,I); %this is faster
    [is,js]=size(I);
    Ib = NaN(is+N-1,js+N-1); %add borders
    b=(N-1)/2 +1;
    Ib(b:b+is-1,b:b+js-1)=I;
    I=zeros(size(I));
    for i = 1:is
        for j = 1:js
            I(i,j)=sum(sum(Ib(i:i+N-1,j:j+N-1).*h,'omitnan'));
        end
    end
    figure(2);imagesc(I);colormap gray
    
    0 讨论(0)
提交回复
热议问题