MATLAB How to implement a Ram-Lak filter (Ramp filter) in the frequency domain?

前端 未结 1 1270
遥遥无期
遥遥无期 2020-12-10 19:49

I have an assignment to implement a Ram-Lak filter, but nearly no information given on it (except look at fft, ifft, fftshift, ifftshift).

I have a sinogram that I h

相关标签:
1条回答
  • 2020-12-10 20:49

    The formula you listed is an intermediate result if you wanted to do an inverse Radon transform without filtering in the Fourier domain. An alternative is to do the entire filtered back projection algorithm using convolution in the spatial domain, which might have been faster 40 years ago; you would eventually rederive the formula you posted. However, I wouldn't recommended it now, especially not for your first reconstruction; you should really understand the Hilbert transform first.

    Anyway, here's some Matlab code which does the obligatory Shepp-Logan phantom filtered back projection reconstruction. I show how you can do your own filtering with the Ram-Lak filter. If I was really motivated, I would replace radon/iradon with some interp2 commands and summations.

    phantomData=phantom();

    N=size(phantomData,1);
    
    theta = 0:179;
    N_theta = length(theta);
    [R,xp] = radon(phantomData,theta);
    
    % make a Ram-Lak filter. it's just abs(f).
    N1 = length(xp);
    freqs=linspace(-1, 1, N1).';
    myFilter = abs( freqs );
    myFilter = repmat(myFilter, [1 N_theta]);
    
    % do my own FT domain filtering
    ft_R = fftshift(fft(R,[],1),1);
    filteredProj = ft_R .* myFilter;
    filteredProj = ifftshift(filteredProj,1);
    ift_R = real(ifft(filteredProj,[],1));
    
    % tell matlab to do inverse FBP without a filter
    I1 = iradon(ift_R, theta, 'linear', 'none', 1.0, N);
    
    subplot(1,3,1);imagesc( real(I1) ); title('Manual filtering')
    colormap(gray(256)); axis image; axis off
    
    % for comparison, ask matlab to use their Ram-Lak filter implementation
    I2 = iradon(R, theta, 'linear', 'Ram-Lak', 1.0, N);
    
    subplot(1,3,2);imagesc( real(I2) ); title('Matlab filtering')
    colormap(gray(256)); axis image; axis off
    
    % for fun, redo the filtering wrong on purpose
    % exclude high frequencies to create a low-resolution reconstruction
    myFilter( myFilter > 0.1 ) = 0;
    ift_R = real(ifft(ifftshift(ft_R .* myFilter,1),[],1));
    I3 = iradon(ift_R, theta, 'linear', 'none', 1.0, N);
    
    subplot(1,3,3);imagesc( real(I3) ); title('Low resolution filtering')
    colormap(gray(256)); axis image; axis off
    

    Demonstration of manual filtering

    0 讨论(0)
提交回复
热议问题