absolute_phase — 3D structured_light op

• Datenarten: image2d × image2d → image2d

• Aufruf: import fullseye as fs; fs.ledger.absolute_phase(wrapped, coarse) -> 'np.ndarray' (die Implementierung direkt: import fringe; fringe.absolute_phase(wrapped, coarse) -> 'np.ndarray'; aus dem Register: ops3d.get("absolute_phase"))

• GPU: nur innerhalb einer Kette (mechanischer GPU-Pfad aus der Allow-List, CuPy). Bleibt nur auf der GPU, wenn auch die Nachbarstufe auf der Allow-List steht. Ein Einzelaufruf läuft auf der CPU

Verwendung

Macht aus einer eingewickelten Phase eine absolute, indem die Streifenordnung aus einer groben, aber absoluten Phasenschätzung festgelegt wird.

Φ = wrapped + 2π·round((coarse − wrapped) / 2π)

wrapped: Ausgabe von wrapped_phase, ein 2D-Array in (-π,π] (hochgenau, ohne absolute Ordnung).

coarse: 2D-Array gleicher Form. Eine absolute, aber grobe Phasenschätzung [rad]. Typisch ist die per Gray-Code dekodierte

Projektorspaltennummer, in Phase umgerechnet (2π·freq·col/width). NaN erlaubt (Ausgabe ebenfalls NaN).

Rückgabewert: absolute Phase [rad] (2D float64). Ungültige Pixel (eines von beiden NaN) sind NaN.

Warum nötig (Unterschied zum räumlichen Entfalten): unwrap_phase_2d folgt benachbarten Pixeln, um 2π-Sprünge zu überbrücken, daher (a) bleibt ein globaler Offset +2πm, und (b) kann die Ordnung zwischen durch Verdeckung getrennten Inseln nicht weitergegeben werden. Diese Op bestimmt die Ordnung pixelweise unabhängig und ist daher auch in in Inseln zerfallenen Szenen absolut, und braucht keine Weitergabe. Im Gegenzug muss der Fehler von coarse kleiner als eine halbe Periode (π) sein.

Anforderung (fail-closed): |coarse − Φ_true| < π. Wird sie verletzt, wählt round die benachbarte Ordnung, und nur dieses Pixel verschiebt sich stillschweigend um 2π (= die Tiefe von 1 Streifen). Die Streifenzahl freq so wählen, dass die Grobheit des Gray-Codes (±0.5 Spalte), in Phase umgerechnet, eine halbe Periode nicht überschreitet (z. B. Projektorbreite 512 px, freq 24 → 1 Periode 21.3 px, Grays ±0.5 px liegen bequem innerhalb).

★Ein Ordnungsfehler ist am Rückgabewert nicht zu erkennen (gemessen 2026-11-09): beim zeitlichen Mehrfrequenz-Entfalten (16/4/1 mm, Verhältnis 4, 200.000 Pixel) mit Phasenrauschen σφ = 0.10/0.20/0.30/0.40/0.60 rad wählen 0/0.097/2.57/11.6/36.8 % der Pixel die falsche 2π-Ordnung, und alle kommen als endliche Werte zurück. Das Residuum ansehen:

Phi = absolute_phase(w, c); resid = c - Phi bilden und Pixel mit etwa |resid| > 0.8π als verdächtig verwerfen (unter den obigen Bedingungen fängt das 33–74 % der Fehler; es ist das Zeichen, dass |coarse − Φ| < π verletzt ist). Auch die Einheit von coarse (Radiant) wird nicht geprüft —— Grad übergeben liefert stillschweigend Werte wie 1106 rad (wahr 19.35). Eine Op, die die Ordnung prüft, gibt es noch nicht (eine Op mit Residuum und Markierung kommt über den Weg zum Hinzufügen von Ops).

Raises: ValueError bei Formabweichung, nicht 2D oder wenn wrapped weit außerhalb von (-π,π] liegt.

Herkunft (öffentliche Literatur): das kombinierte Verfahren, das aus Gray-Code und Phasenverschiebung die absolute Phase gewinnt -- Sansoni et al., *Appl. Opt.* 38(31) 1999 / Zhang, *Opt. Lasers Eng.* 48 2010 (Übersicht). Projektion des Gray-Codes selbst: Inokuchi et al., *ICPR* 1984.

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_scan — py -3.11 examples_3d/structured_light_scan.py

Typkompatible Folge-Operatoren (nehmen image2d als Eingabe)

fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade

Gleiche Kategorie (structured_light)

wrapped_phase · unwrap_phase_2d · graycode_decode · decode_fringe · fringe_ftp_phase · depth_from_focus · synthesize_fringes · 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.