photometric op• Datenarten: images → normalmap
• Aufruf: import fullseye as fs; fs.ledger.photometric_stereo(images, lights, mask=None, normalize=True, *, lit_only=False, lit_thresh=0.001) (die Implementierung direkt: import photometric; photometric.photometric_stereo(images, lights, mask=None, normalize=True, *, lit_only=False, lit_thresh=0.001); aus dem Register: ops3d.get("photometric_stereo"))
• Rückgabewert über das Register: fullseye.ledger.photometric_stereo(...) liefert nur den Wert des deklarierten Out-Typs normalmap (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.photometric_stereo.raw(...) oder rufe photometric.photometric_stereo direkt auf.
Lambertsches photometrisches Stereo: rekonstruiert Normalen und Albedo aus N Bildern unter bekannten Lichtrichtungen. → (normals HxWx3, albedo HxW).
I_n = albedo * max(N·L_n, 0). In jedem Pixel wird g = albedo*N per kleinster Quadrate g = pinv(L) @ I gelöst, albedo=|g|, normal=g/|g|. N>=3 erforderlich. Pixel mit albedo~0 oder außerhalb der mask erhalten normal=(0,0,1). normalize=True normiert die Lichtvektoren auf Einheitsrichtungen (gleiche Konvention wie render_lambertian = der Absolutwert der Albedo stimmt). Bei intensitätsgewichteten Lichtquellen normalize=False setzen und auch auf der Syntheseseite die Rohvektoren verwenden.
lit_only (hinzugefügt 2026-09-04): löst unter Ausschluss angehefteter Schatten (attached shadow). Das max(·, 0) des Modells ist nichtlinear; Beobachtungen mit N·L < 0 (wahrer Wert 0) direkt in die linearen kleinsten Quadrate zu geben, verzerrt die Lösung -- gemessen: auf einer Kugel ohne Schatten und ohne AO beträgt der Median 9°, beim Lösen nur mit den leuchtenden Lichtquellen 0.000°. Standard ist False (das bisherige Verhalten bleibt). Mit True wird jedes Pixel nur mit den Lichtquellen mit I > lit_thresh neu gelöst. Pixel mit gleichem Beleuchtungsmuster werden gebündelt und mit 1 Pseudoinversen verarbeitet, daher wachsen die Zusatzkosten nur etwa proportional zur Zahl der Muster über die Lichtanzahl (bei 6 Lichtern höchstens 64 Gruppen). Pixel mit weniger als 3 leuchtenden Lichtquellen fallen auf die Lösung mit allen Lichtern zurück (fail-open:
ein Wert, auch ein verzerrter, zerstört die nachgelagerte Integration weniger, als unlösbare Pixel auf NaN zu setzen).
lit_thresh: Untergrenze der Leuchtdichte, die als "leuchtend" gilt. Oberhalb des Aufnahmerauschens ansetzen.
• 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
normalmap als Eingabe)fuse_to_voxel · render_shaded · phong_shade · matcap_shade · brdf_lommel_seeliger · brdf_hapke · bump_normals_fbm · integrate_normals
photometric)surface_normals · integrate_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.