Drag the camera or use the angle slider. Sweep continuously, or choose step-and-shoot to record individual views. Each recorded slice profile becomes a sinogram row.
Gamma camera — live projection
feet · z · head →
the cyan strip is the slice recorded ↓
counts ↕← s, across x–y →
one profile → one sinogram row
↔ Drag camera to rotate
θ = 0°
drag detector = rotate the gantry about z drag background = orbit view · scroll = zoom
Couldn’t load Three.js from the CDN.
The 3D view needs an internet connection.
The projection and sinogram panels still work with the slider.
Acquisition
Moving the camera records every angle it crosses.
Changing mode or spacing starts a new sinogram.
θ
slice
← feetmid-bodyhead → (z)
The cyan strip picks the slice: one plane across z. Move it and the same views are re-read at that level, and every slice has its own sinogram.
Angles acquired: 0 / ?
Object — source of the projections
Example phantom (analytic)
Select all slice files of one uncompressed series (or a multi-frame file).
Compressed transfer syntaxes (JPEG/JPEG2000) aren’t decoded here.
Sinograms — raw vs ramp-filtered, stacked by angle
raw
ramp filtered
← detector position s, across x–y →↓ angle 0–360°
At each gantry angle the parallel-hole collimator records line integrals of the activity, an
ideal parallel projection over the whole camera face (attenuation and scatter ignored). Only the
cyan strip through the slice is followed here: its profile is one row, and stacking that row from
every angle builds the sinogram, where each hot spot traces a sinusoid. Every other row of
the camera builds the sinogram of its own slice the same way. The ramp filter
is the pre-weighting step of filtered backprojection; it boosts high spatial frequencies to cancel
the 1/r blur, which is why the filtered sinogram looks edge-enhanced with dark overshoot lobes.
Switch to the Reconstruct tab to see a sinogram inverted.
Inspired by Adam Kesner’s animated-GIF explanations.
the estimate in 3D — anterior view, head up drag to orbit · scroll = zoom
The whole volume is reconstructed, so the 3D view is the estimate itself, not the object; the cyan ring marks the slice shown beside it. Estimate and pinned share a display scale, normalized by their projection counts, and one scale covers every level.
θ = 0°
estimate
transaxial slice · anterior up
pinned
kept for comparison
true activity
the object being estimated
Measured sinograms — measured rows; used ones brightest
raw
ramp filtered
← detector position s →↓ angle 0–360°
Current row, backprojected — one angle’s contribution
raw blur
filtered blur
← across x →y anterior ↑
Reconstruction
A complete scan of this many evenly spaced views is assumed, so this tab stands alone: it does not use what you acquired in step 1.
θ
Sinogram rows used: 0 / ?
Slice location — one transaxial (x–y) plane, at a position along z
feet · z · head →
slice
← feetmid-bodyhead → (z)
The images above are that one plane. A full study reconstructs every slice and stacks them into the 3D volume.
Backprojection runs the acquisition in reverse: each sinogram row is blurred back across
the image along the direction it was measured. Summing the raw blurs piles up a 1/r haze, and
simple backprojection stays blurry however many angles are added. Ramp-filtering each
row first adds negative side-lobes (blue in the filtered blur) that cancel the haze, so
filtered backprojection converges to the true slice, already recognizable from a few
dozen views. Fewer evenly spaced views reveal streak artefacts. In this ideal model, opposite
views are redundant; attenuation, scatter and counting noise are not simulated.
Inspired by Adam Kesner’s animated-GIF explanations.