2016-04-05 10 views
1

Я пытаюсь написать свой собственный код MATLAB для вычисления обратного преобразования радона (iradon), и до сих пор мне удалось успешно восстановить изображение с помощью рампы фильтра, окна помех и также используя свертку 1D проекций в пространственной области с окном h в моем коде на основе учебника Кака и Шейки. Тем не менее, я думаю, что если я возьму БПФ окна h и умножу это на БПФ 1D-проекций, я должен иметь возможность получить такую ​​же реконструкцию. К сожалению, у меня получается беспорядок.Отфильтрованное обратное проектирование в MATLAB и проектирование фильтра

function [out] = myfbp4(arg2); 


ph = phantom(); 
sino = radon(phantom,0:0.1:179); 

rho2 = 183; % max rho 
rho1 = -183; % min rho; 
step = 1; 
npos = 367; 
dtheta = 0.1; 
angles = deg2rad(0:dtheta:179); 
nproj = length(angles); 



n1 = ceil(log(npos)/log(2)); 
N = 2^n1;     % smallest power of 2 greater than npos (for fft efficiency) 
N = 1024; % for zero padding 
fs = 1; % sampling frequency 
T = 1; % sample spacing 

% grid for reconstructed image 
x1 = rho1:step:rho2; 
y1 = rho1:step:rho2; 

[yyy, xxx] = ndgrid(-y1, x1); 


% build filter h according to Kak and Shakey 
h = -floor(npos/2):T:floor(npos/2); 

for i = 1:length(h) 
    if (mod(h(i),2) == 1) 
     h(i) = -1./(h(i)^2 * pi^2 * T^2); 
    else 
     h(i) = 0; 
    end  
    h(ceil(npos/2)) = 1/(4*T^2); 
end 

%%%%%%%%%%% RAMP FILTER %%%%%%%%%%%%%%%% 
%%%%%%%%%% this is un needed when using h %% 
%%%%%%%%%% see below... %%%%%%%%%%%%%%%%%%%% 
rampFilterNum = [0:1:N/2-1 -N/2:1:-1]; 
rampFilterAbs = abs(rampFilterNum); 
rampFilter = rampFilterAbs *fs/N; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 


% positions made to correspond to N point fft 
drho = (rho2 - rho1)/(npos-1); 
rho = rho1 + (0:(npos-1)) * drho; 
positions = zeros(nproj, length(rho)); 
for i = 1:nproj, 
    positions(i, :) = rho; 
end 

if (strcmp(arg2,'filter')) 
    % compute FT of h and multiply by fft projections 
    fftProj = fft(sino, N); 
    hfft = fft(h,N); 
    fftProjFiltered = bsxfun(@times, hfft', fftProj); 
    ifftProj = real(ifft(fftProjFiltered)); 
    filteredProjections = ifftProj; 
end 

if (strcmp(arg2,'conv')) 
    % make image my convolution of projections with h 
    for iproj = 1:nproj 
     sino(:, iproj) = conv(sino(:,iproj), h, 'same'); 
    end 
    filteredProjections = sino; 
end 


% display the image through backprojection 
fdata = zeros(size(xxx)); 
for iproj = 1:nproj 
    theta = angles(iproj); 
    rho1 = xxx*cos(theta) + yyy*sin(theta); % rotate coordinate system by theta 
    %r = x1; 
    r = positions(iproj,:); 

    fdata1 = filteredProjections(1:npos,iproj); % filtered projections 
    %fdata1 interp1(
    fdata2 = interp1(r, fdata1, rho1, 'linear', 0); 
    fdata = fdata + deg2rad(dtheta) * fdata2; %theta*fdata2; 
end 

out = fdata; 
end 

Только на исходе = myfbp4 ('усл') или myfbp4 ('фильтр') покажет вам разные результаты. Кажется, что свертка работает отлично, но подход к фильтрации не работает, как я надеялся.

Может ли кто-нибудь увидеть проблему? (извинения, если есть лишний код, я попытался вырезать большую часть этого ... Я также должен был упомянуть, что этот код был заимствован где-то и немного модифицирован, но я не помню, где я его нашел).

Заранее благодарен

EDIT: Проблема решена. Проблема заключалась в том, что я не принимал абсолютное значение преобразования Фурье окна h для получения частотного окна. Для тех, кто находит это, hfft = abs (fft (h, N)) следует заменить hfft = fft (h, N).

+0

Вы должны ответить на это самостоятельно и отметить ответ как принятый, чтобы каждый мог видеть, что проблема решена. http://stackoverflow.com/help/self-answer – Tapio

ответ

2

Проблема решена. Проблема заключалась в том, что я не принимал абсолютное значение преобразования Фурье окна h для получения частотного окна. Для тех, кто находит это, hfft = abs (fft (h, N)) следует заменить hfft = fft (h, N).

 Смежные вопросы

  • Нет связанных вопросов^_^