summaryrefslogtreecommitdiffstats
path: root/samples/matlab/s017_opTomo.m
blob: 4886cc5e50a44cb08e6243546f057401f9bc1644 (plain)
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');