1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
% load a phantom image
im = phantom(256);
% and flatten it to a vector
x = im(:);
%% Setting up the geometry
% projection geometry
proj_geom = astra_create_proj_geom('parallel', 1, 256, linspace2(0,pi,180));
% object dimensions
vol_geom = astra_create_vol_geom(256,256);
%% Generate projection data
% Create the Spot operator for ASTRA using the GPU.
W = opTomo('cuda', proj_geom, vol_geom);
p = W*x;
% reshape the vector into a sinogram
sinogram = reshape(p, W.proj_size);
imshow(sinogram, []);
%% Reconstruction
% We use a least squares solver lsqr from Matlab to solve the
% equation W*x = p.
% Max number of iterations is 100, convergence tolerance of 1e-6.
y = lsqr(W, p, 1e-6, 100);
% the output is a vector, so we reshape it into an image
reconstruction = reshape(y, W.vol_size);
subplot(1,3,1);
imshow(reconstruction, []);
title('Reconstruction');
subplot(1,3,2);
imshow(im, []);
title('Ground truth');
% The transpose of the operator corresponds to the backprojection.
backProjection = W'*p;
subplot(1,3,3);
imshow(reshape(backProjection, W.vol_size), []);
title('Backprojection');
|