decode_fringe — 3D structured_light op

• Datenarten: images → depth

• Aufruf: import fullseye as fs; fs.ledger.decode_fringe(phase_shift_images, ref_phase=None, k=1.0, mask=None, min_modulation=None) -> 'np.ndarray' (die Implementierung direkt: import fringe; fringe.decode_fringe(phase_shift_images, ref_phase=None, k=1.0, mask=None, min_modulation=None) -> 'np.ndarray'; aus dem Register: ops3d.get("decode_fringe"))

Verwendung

Decodiert eine Phasenschiebe-Bildserie in einem Zug: wrapped → Entfaltung → (per Referenzsubtraktion) Höhe.

phase_shift_images: N-Step-Folge phasenverschobener Streifenbilder ((N,H,W) oder Sequenz der Länge N).

ref_phase: entfaltete Phase der Referenzebene (Höhe 0). Bei None ist Höhe = k·(unwrapped).

k: Kalibrierkonstante Phase→Höhe.

mask: optional. True=gültiges Pixel. Ungültige Pixel sind NaN.

min_modulation: optional. Falls angegeben, werden Pixel mit modulation < diesem Wert als wenig vertrauenswürdig ungültig gemacht.

Rückgabewert: Höhenkarte (2D float). Bei ref_phase=None wird die mit k multiplizierte stetige Phase zurückgegeben. Ungültige Pixel sind NaN.

Vorgehen (wie implementiert): wrapped_phase → Vertrauensmaske bilden (falls min_modulation gegeben, modulation(stack) >= min_modulation; falls mask gegeben, AND damit) → unwrap_phase_2d(wrapped, mask=Vertrauensmaske) → ist ref_phase None, k * unwrapped, sonst phase_to_height (k * (unwrapped - ref_phase)).

Argumente:

• phase_shift_images: (N, H, W), N >= 3, gleichabständige Phasenverschiebungen.

• ref_phase: Skalar oder (H, W). Die Phase der Referenzfläche übergeben, mit demselben Verfahren entfaltet (damit der globale Offset von unwrap_phase_2d in beiden gleich behandelt wird, ist es am sichersten, auch für die Referenz das Ergebnis der Dekodierung mit dieser Op und ref_phase=None zu verwenden).

• k: Kalibrierkonstante Phase→Höhe (Einheit/rad). Entspricht dem Kehrwert von phase_gain aus synthesize_fringes.

• mask: (H, W) bool, True = gültig. min_modulation: Untergrenze der Modulationstiefe (etwa [0, 1]; verwirft Pixel in Schatten und Sättigung).

Prüfung (ValueError): Bildfolge nicht 3-D, N < 3, nicht endlich / mask mit anderer Form / ref_phase mit anderer Form / null gültige Pixel. Ohne scikit-image RuntimeError.

Rückgabewert: (H, W) float64. Ungültige Pixel sind NaN. Die Einheit ist die Einheit von k.

Achtung: es beruht auf räumlichem Entfalten; in Szenen, die durch Stufen oder Verdeckung in Inseln zerfallen, kann pro Insel ein Höhenoffset von 2πm k verbleiben. Wird absolute Höhe benötigt, ist der Pfad graycode_decode → absolute_phase → triangulate_column.

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• depth_sensors — Tiefensensoren — Messprinzipien, Werte realer Geräte, wie Messlücken entstehen

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.

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

• structured_light — py -3.11 examples_3d/structured_light.py

Typkompatible Folge-Operatoren (nehmen depth als Eingabe)

depth_to_points · tsdf_from_depth · to_points · fuse_to_voxel · depth_to_organized_points · normals_from_depth · occlusion_edges · bearing_angle_image

Gleiche Kategorie (structured_light)

wrapped_phase · unwrap_phase_2d · graycode_decode · synthesize_fringes · absolute_phase · triangulate_column


*Provenance: fringe.py — 3D 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.