Can ifanbeam use all the sinogram generated by fanbeam ?

3 views (last 30 days)
Hi,
I'm using fanbeam and ifanbeam, and have just realized that ifanbeam does not use all the sinogram when reconstructing in 'FanCoverage' 'cycle' mode. I used fanbeam to compute the sinogram of an image with FanRotationIncrement = 1, got 360 projections, and realized that ifanbeam does not use at all projections 199 to 342. Setting the corresponding columns to zero does not change at all ifanbeam's output.
Is there a way to modify this behavior ? I would like to use all the data I have acquired, not throw away a third of it (in a noisy environment, there is no reason not to use this data).
I hope someone knows a workaround
  2 Comments
Matt J
Matt J on 9 Nov 2012
Edited: Matt J on 9 Nov 2012
I'm skeptical, I guess, whether FanCoverage is really set to 'cycle'. We probably need to see your code, or a simplified version of it.
Also, have you checked that those columns weren't already zero to begin with?
Cyril Mory
Cyril Mory on 12 Nov 2012
No problem. Here you go :
ObjectSize = 256;
Object = phantom('Modified Shepp-Logan', ObjectSize);
% Parameters
NumberOfProjectionAngles = 360;
FanRotationIncrement = 360 / NumberOfProjectionAngles;
% Fan beam specific stuff
FanAngle = 30;
FanSensorGeometry = 'line';
SourceCenterDistance = ObjectSize/2 * (1 + 1/tan(FanAngle * pi / 180));
FanSensorSpacing = 1;
Sinogram = fanbeam(Object, SourceCenterDistance, 'FanRotationIncrement', FanRotationIncrement);
Beams = zeros(ObjectSize*3, ObjectSize*3, NumberOfProjectionAngles);
for i=1:NumberOfProjectionAngles
Mask = zeros(size(Sinogram));
Mask(:,i) = 1;
GatedRecon = ifanbeam(Sinogram .* Mask, ...
SourceCenterDistance, ...
'FanCoverage', 'cycle', ...
'FanRotationIncrement', FanRotationIncrement, ...
'Filter', 'Ram-Lak', ...
'OutputSize', ObjectSize*3);
Beams(:,:,i) = GatedRecon;
end
implay(Beams);
FullRecon = ifanbeam(Sinogram, ...
SourceCenterDistance, ...
'FanCoverage', 'cycle', ...
'FanRotationIncrement', FanRotationIncrement, ...
'Filter', 'Ram-Lak', ...
'OutputSize', ObjectSize*3);
Mask = ones(size(Sinogram));
Mask(:,199:342) = zeros(size(Sinogram,1), 144);
ReconWithMask = ifanbeam(Sinogram .* Mask, ...
SourceCenterDistance, ...
'FanCoverage', 'cycle', ...
'FanRotationIncrement', FanRotationIncrement, ...
'Filter', 'Ram-Lak', ...
'OutputSize', ObjectSize*3);
figure(1); imshow(ReconWithMask);
figure(2); imshow(FullRecon);
figure(3); imshow(ReconWithMask - FullRecon);
MaxInDiffImage = max(ReconWithMask(:) - FullRecon(:))
Yes, the columns I set to zero in the sinogram were non-zero.
To the best of my understanding, FanCoverage is only important for ifanbeam to choose the right sinogram columns to reconstruct from. But it seems to perform a short-scan reconstruction no matter what FanCoverage is set to.

Sign in to comment.

Accepted Answer

Cyril Mory
Cyril Mory on 6 Dec 2012
I have edited ifanbeam and some of its subfunctions to correct for this problem, and posted the modified files on http://www.mathworks.com/matlabcentral/fileexchange/39332

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!