metal_trace_interpolate — TOMOGRAPHY artifact op

Datenarten: sinogramsinogram

Aufruf: import tomography; tomography.metal_trace_interpolate(sinogram, angles_deg=None, image_threshold=None, mask=None, size=None) (oder opstomography.get("metal_trace_interpolate"))

Verwendung

Metallartefaktreduktion durch lineare Interpolation (LI-MAR).

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

A metal implant attenuates so strongly that its detector bins carry almost no

photons; the measured line integrals there are dominated by scatter and by the

noise floor of the logarithm, and back-projecting them lays down the dark

bands and bright streaks between dense objects that make a slice unreadable.

The oldest working answer, and still the baseline every newer method is

compared against: declare the affected bins *missing* and fill them by linear

interpolation along the detector axis, per angle. The result is not the truth

— it is a smooth guess with the streaks removed — and it blurs whatever was

genuinely behind the metal.

**How the affected bins are found matters more than the interpolation, and

the obvious way is measurably worse than doing nothing.** The metal trace is

located the way LI-MAR actually does it: reconstruct once with

:func:filtered_backprojection, threshold the *image* at

`mean + 3*std`, forward-project that binary mask, and treat the bins it

touches as missing. Thresholding the sinogram directly is the shortcut

that suggests itself, and on the Shepp-Logan phantom with a 6-px implant it

goes wrong in the direction that is hardest to notice — it flags the densest

*legitimate* structure (the skull, seen edge-on) and interpolates it away:

implant density uncorrected sinogram threshold image threshold

x8 0.0487 0.0626 0.0255

x30 0.1583 0.2249 0.0255

x100 0.5214 0.7127 0.0257

(normalised RMS error against the metal-free truth, outside the implant

footprint; the metal-free reconstruction itself scores 0.0250.) The image

route recovers essentially all of the damage at every density. The sinogram

route makes it 1.3-1.4x *worse* than not correcting at all, at every density,

while still producing a picture with fewer visible streaks — which is why the

shortcut is not offered as an option here rather than merely discouraged.

Inside the implant footprint the reconstruction is now wrong on purpose: the

metal is gone. Clinical practice puts it back from the thresholded

reconstruction afterwards; that step is not implemented.

:param sinogram: `(n_angles, n_detectors)`.

:param angles_deg: view angles; `None -> uniform [0, 180)`. Used for the

internal reconstruction and re-projection, so a wrong angle set here

misplaces the trace.

:param image_threshold: image-domain metal threshold; `None` ->

`mean + 3*std` of the internal reconstruction.

:param mask: explicit boolean `(n_angles, n_detectors)` metal trace. When

given, no reconstruction is done and *image_threshold* is ignored — this

is the route to use when the trace comes from a segmentation you trust.

:param size: side of the internal reconstruction; `None` -> the inscribed

square.

:returns: `(n_angles, n_detectors)` float64 sinogram.

:raises ValueError: if the mask shape disagrees with the sinogram, if the mask

is not boolean, if nothing is left to interpolate from, or if any *row* is

entirely masked.

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_reconstructionpy -3.11 examples/ct_reconstruction.py

Typkompatible Folge-Operatoren (nehmen sinogram als Eingabe)

backproject_sinogram · filtered_backprojection · sart_reconstruct · beam_hardening_apply · beam_hardening_correct · ring_artifact_apply · ring_artifact_remove · sinogram_center_of_rotation

Gleiche Kategorie (artifact)

beam_hardening_apply · beam_hardening_correct · ring_artifact_apply · ring_artifact_remove


*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.