seventh code

 avatar
user_4319474
plain_text
2 years ago
2.7 kB
8
Indexable
% Obtain sinograms for each slice in the projection
sinograms = zeros(size(image_stack, 1), size(image_stack, 2), num_slices);
for i = 1:num_slices
    sinograms(:, :, i) = radon(image_stack(:, :, i), angles);
end

% Reconstruct images using iradon
reconstructions_iradon = zeros(size(image_stack));
for i = 1:num_slices
    reconstructions_iradon(:, :, i) = iradon(sinograms(:, :, i), angles, 'linear', 'none', 1);
end

% Reconstruct images using ifanbeam
reconstructions_ifanbeam = zeros(size(image_stack));
for i = 1:num_slices
    reconstructions_ifanbeam(:, :, i) = ifanbeam(sinograms(:, :, i), angles, 'FanSensorGeometry', 'line', 'none', 1);
end

% Display images
slice_indices = [10, 20, 30]; % choose some representative slices
for i = 1:length(slice_indices)
    slice_index = slice_indices(i);
    figure;
    subplot(1, 3, 1);
    imshow(image_stack(:, :, slice_index), []);
    title(sprintf('Original slice %d', slice_index));
    subplot(1, 3, 2);
    imshow(reconstructions_iradon(:, :, slice_index), []);
    title(sprintf('Reconstructed slice %d (iradon)', slice_index));
    subplot(1, 3, 3);
    imshow(reconstructions_ifanbeam(:, :, slice_index), []);
    title(sprintf('Reconstructed slice %d (ifanbeam)', slice_index));
end

% Simulate non-idealised conditions
sinograms_noisy = sinograms .* (0.9 + rand(size(sinograms)) * 0.2);

% Reconstruct noisy images using iradon
reconstructions_iradon_noisy = zeros(size(image_stack));
for i = 1:num_slices
    reconstructions_iradon_noisy(:, :, i) = iradon(sinograms_noisy(:, :, i), angles, 'linear', 'none', 1);
end

% Reconstruct noisy images using ifanbeam
reconstructions_ifanbeam_noisy = zeros(size(image_stack));
for i = 1:num_slices
    reconstructions_ifanbeam_noisy(:, :, i) = ifanbeam(sinograms_noisy(:, :, i), angles, 'FanSensorGeometry', 'line', 'none', 1);
end

% Display noisy images
for i = 1:length(slice_indices)
    slice_index = slice_indices(i);
    figure;
    subplot(1, 3, 1);
    imshow(image_stack(:, :, slice_index), []);
    title(sprintf('Original slice %d', slice_index));
    subplot(1, 3, 2);
    imshow(reconstructions_iradon_noisy(:, :, slice_index), []);
    title(sprintf('Noisy reconstructed slice %d (iradon)', slice_index));
    subplot(1, 3, 3);
    imshow(reconstructions_ifanbeam_noisy(:, :, slice_index), []);
    title(sprintf('Noisy reconstructed slice %d (ifanbeam)', slice_index));
end

% Remove filter
sinograms_unfiltered = fftshift(ifft(ifftshift(sinograms), [], 1), 1); % inverse FFT along rows
reconstructions_unfiltered = zeros(size(image_stack));
for i = 1:num_slices
    reconstruction_unfiltered = fftshift(ifft(ifftshift(sinograms_unfiltered(:,
Editor is loading...