range_image op• Datenarten: depth → normalmap
• Aufruf: import fullseye as fs; fs.ledger.normals_from_depth(depth, fx=None, fy=None, cx=None, cy=None, orient_to_camera=True, spacing=None) (die Implementierung direkt: import range_image; range_image.normals_from_depth(depth, fx=None, fy=None, cx=None, cy=None, orient_to_camera=True, spacing=None); aus dem Register: ops3d.get("normals_from_depth"))
Organisierte Tiefe → orientierte Einheitsnormalen (H,W,3). Das Kreuzprodukt der 3-D-Punkte benachbarter Pixel (nutzt die Gitterstruktur, O(HW)).
Mit fx,fy perspektivisch, ohne Angabe orthographisch. orient_to_camera=True vereinheitlicht das Vorzeichen der Normalen in Richtung Kamera (Ursprung).
★Eine andere Funktion gleichen Namens existiert in der 1-Zeilen-Fassade. fullseye.normals_from_depth ist die perspektivische Version mit Pflichtargument K (depth, K, smooth=0), diese hier (über fullseye.ledger = range_image) die orthographische Version ohne K. Wer sich die Aufrufweise der einen merkt, bekommt bei der anderen einen TypeError (gemessen 2026-09-08).
★spacing=(dy, dx) ist die reale Pixelgröße im orthographischen Modus. Der Standard None bedeutet "1 Pixel = 1 Einheit", und übergibt man ein anisotropes Gitter (z. B. Spalte 0.05 mm × Zeile 0.5 mm) unverändert, verschiebt sich die Neigung stillschweigend -- gemessen lag die x-Komponente um das 20-fache (= 1/dx-fache) daneben, ohne Ausnahme und ohne Warnung. Sind die realen Maße bekannt, unbedingt übergeben. Im perspektivischen Modus (fx/fy angegeben) bestimmt die Brennweite die realen Maße, daher wird es ignoriert. ★Bei Übergabe von spacing orient_to_camera=False setzen. Die "Kamera" im orthographischen Modus ist nur der behelfsmäßige Ursprung (oben links, Tiefe 0); mit realen Maßen ändert sich ihre Lage relativ zur Fläche, und das Vorzeichen kann sich umkehren (gemessen: auf einer Ebene mit Neigung 0.1 stimmt orient_to_camera=False mit dem wahren Wert x=-0.0995 überein, True ergibt +0.0995). Wird eine Orientierung benötigt, diese in einer späteren Stufe in einem Koordinatensystem angleichen, in dem eine Blickrichtung definiert ist.
Die Normale ergibt sich aus dem Kreuzprodukt benachbarter Pixel, daher sind Nachbarn in beiden Achsen nötig. Bei H<2 or W<2 fehlt die 2. Tangentenrichtung, und die Normale ist nicht definiert (den Gradienten dieser Achse als 0 anzunehmen würde stillschweigend die entartete Normale cross(dPx,0)=[0,0,0] zurückgeben). Fail-closed: dies wird ausdrücklich mit ValueError abgewiesen.
Berechnet wird mit depth_to_organized_points der 3-D-Punkt P, dann das Kreuzprodukt dPx × dPy aus der Spaltendifferenz dPx und der Zeilendifferenz dPy von np.gradient auf Einheitslänge gebracht (am Rand einseitige Differenzen). Mit orient_to_camera=True werden Pixel mit n·(-P) < 0 umgedreht, sodass die Normalen zum Ursprung (Kamera) zeigen. Im orthographischen Modus (fx oder fy ist None) ist P=(u,v,d), der Ursprung liegt also oben links im Bild bei Tiefe 0, und "zur Kamera" bedeutet etwas anderes als im perspektivischen Modus. Ohne cx und cy gilt die Bildmitte. An Pixeln, die eine Tiefenstufe (Verdeckungskante) überspannen, erfasst das Kreuzprodukt die Richtung der Stufe und die Normale wird zerstört; daher vorher die Grenzpixel mit occlusion_edges entfernen. Pixel mit Tiefe 0 / NaN werden nicht geprüft, und ihre Normalen sind unbestimmt. Rückgabewert ist float32 (H,W,3).
• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)
• depth_sensors — Tiefensensoren — Messprinzipien, Werte realer Geräte, wie Messlücken entstehen
• 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.
• range_image — py -3.11 examples_3d/range_image.py
normalmap als Eingabe)fuse_to_voxel · render_shaded · phong_shade · matcap_shade · brdf_lommel_seeliger · brdf_hapke · bump_normals_fbm · integrate_normals
range_image)depth_to_organized_points · occlusion_edges · bearing_angle_image
*Provenance: range_image.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.