filtered_backprojection — TOMOGRAPHY reconstruct op

• Datenarten: sinogram → image2d

• Aufruf: import fullseye as fs; fs.ledger.filtered_backprojection(sinogram, angles_deg=None, size=None, filter_name='ramp', cutoff=1.0, span_deg=None, _op='filtered_backprojection') (die Implementierung direkt: import tomography; tomography.filtered_backprojection(sinogram, angles_deg=None, size=None, filter_name='ramp', cutoff=1.0, span_deg=None, _op='filtered_backprojection'); aus dem Register: opstomography.get("filtered_backprojection"))

Verwendung

Gefilterte Rückprojektion (FBP) — die Standard-CT-Rekonstruktion.

> Die ausführliche Beschreibung unten ist der Originaltext — Zusammenfassung und Überschriften sind übersetzt.

Filter each projection along the detector axis with the ramp |f| (times an optional apodisation window), then back-project. This is the discretised inverse Radon transform, and with enough samples it is exact: reconstructing a uniform disc of density 1.0 from its analytic sinogram returns an interior mean of 1.0011, and — since 2026-09-06 — the same 1.0011 at 363 and at 727 detector bins, and at 180, 360 and 720 views. The old text here read 0.9954 at 363 bins "converging as the detector is refined"; that was not convergence but the ramp's missing DC bin, whose size is set by the FFT pad length (_ramlak_spectrum). The absolute value is what pins the ordinary-versus-angular frequency convention in the ramp: the other convention, equally defensible and printed in the same textbooks, would return 2*pi times this, and a CT slice has no absolute grey level for anyone to notice against.

Where it breaks, measured on the Shepp-Logan phantom (256 px, analytic sinogram so the projector contributes no error of its own; normalised RMS error against the truth):

views FBP (ramp) SART (10 sweeps) FBP/SART

180 0.0250 0.0175 1.43

90 0.0454 0.0195 2.33

45 0.1039 0.0353 2.95

32 0.1362 0.0497 2.74

16 0.2341 0.0859 2.72

8 0.3635 0.1257 2.89

There is no crossing point, and the expectation that there would be one was wrong. The received story is that FBP wins when the data is complete and loses only in the sparse regime; measured here, SART with a non-negativity constraint is better at *every* view count — by 1.43x at 180 views and by about 2.9x once the scan is sparse. What changes with the view count is the price, not the ranking: at 180 views SART costs 312x the wall clock (37.7 s against 0.12 s for a 256-px slice) to buy that 1.43x, which is why filtered back-projection is what production scanners run. At the sparse end the same 2.9x comes nearly free, because both methods scale with the views.

With noise the ranking holds but the margins change, and the apodisation windows stop being decoration (Poisson counts at I0 = 2e4, same phantom):

views FBP ramp FBP hann SART (10 sweeps)

180 0.0360 0.0371 0.0291

45 0.1159 0.0766 0.0385

16 0.2481 0.1921 0.0864

8 0.3813 0.3093 0.1259

At 180 views the exact ramp beats Hann — the data is complete and the roll-off only blurs. At 45 views and below Hann beats the exact inverse by up to 1.5x, because the frequencies the ramp is busy amplifying were never measured.

Filters, and what they trade: "ramp" is the exact inverse and therefore the sharpest and the noisiest; "shepp-logan", "cosine", "hann" and "hamming" roll the high frequencies off, in that order of aggressiveness. "none" skips the filter entirely and gives backproject_sinogram.

:param sinogram: (n_angles, n_detectors), rows = angles. :param angles_deg: view angles in degrees; None -> uniform [0, 180)

with one view per row.

:param size: output side; None -> the inscribed square. :param filter_name: one of FILTERS. :param cutoff: fraction of Nyquist to keep, (0, 1]. :param span_deg: angular range for the d(theta) weight; None -> the

range the views actually cover, inferred from the angle list (exact for

a uniform grid over any span and for any full-coverage irregular set

such as golden angle; see _span_weight).

:returns: (size, size) float64 image. :raises ValueError: on a non-2-D or non-finite sinogram, an angle count that

disagrees with the row count, an unknown filter, a cutoff outside

(0, 1], or an output over MAX_IMAGE_ELEMENTS.

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• ct_reconstruction — py -3.11 examples/ct_reconstruction.py

• poc_ct_fidelity — py -3.11 examples/poc_ct_fidelity.py

Typkompatible Folge-Operatoren (nehmen image2d als Eingabe)

radon_transform

Gleiche Kategorie (reconstruct)

backproject_sinogram · sart_reconstruct


*Provenance: tomography.py — TOMOGRAPHY Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.