photometric op• Datenarten: normalmap → image2d
• Aufruf: import fullseye as fs; fs.ledger.integrate_normals(normals, mask=None) (die Implementierung direkt: import photometric; photometric.integrate_normals(normals, mask=None); aus dem Register: ops3d.get("integrate_normals"))
Normalenfeld → Höhenfeld z per Frankot-Chellappa-Integration. → z, HxW (ein konstanter Offset bleibt frei; auf Mittelwert null bezogen).
Vorgehen: wandelt die Normalen (H,W,3) in Gradienten p = -nx/nz, q = -ny/nz um (bei Pixeln mit |nz| < 1e-6 wird nz durch ±1e-6 ersetzt, um Division durch null zu vermeiden), bestimmt im FFT-Bereich die Lösung kleinster Quadrate Z(wx,wy) = (-j·wx·P - j·wy·Q) / (wx² + wy²) (Gleichanteil 0), transformiert zurück und zieht den Mittelwert ab, sodass er 0 wird. Ist mask (bool HxW) gegeben, werden die Gradienten außerhalb der Maske vor dem Integrieren auf 0 gesetzt (der Bereich wird als eben behandelt). Rückgabewert ist float64 (H,W).
Hinweise:
• Da periodische Ränder angenommen werden, verzerren sich die Ränder, als wären oben/unten und links/rechts des Bildes verbunden.
• Die absolute Höhe ist nicht bestimmt (Mittelwert 0). Integriert wird mit einem Gitterabstand von 1 Pixel, daher ist auch z eine Höhe in Pixeleinheiten; für reale Maße mit dem Pixelabstand multiplizieren.
• Bei nz ≈ 0 (nahe Konturen, Flächen parallel zur Blickrichtung) divergiert der Gradient und verbreitet Wellen in die Umgebung. Mit mask ausschließen oder die Normalen vorher glätten.
Es gibt keine Eingabeprüfung (alles außer (H,W,3) scheitert an der internen Indizierung). surface_normals ist die Umkehrung; übergibt man die Normalen von photometric_stereo hierher, erhält man die Form (Höhenfeld).
• 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.
• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py
image2d als Eingabe)fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade
photometric)photometric_stereo · surface_normals · render_lambertian
*Provenance: photometric.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.