normals_to_egi — REPRCONV direction op

• Datenarten: normals → image2d

• Aufruf: import fullseye as fs; fs.ledger.normals_to_egi(normals, n_az=36, n_el=18) (die Implementierung direkt: import reprconv; reprconv.normals_to_egi(normals, n_az=36, n_el=18); aus dem Register: opsreprconv.get("normals_to_egi"))

Verwendung

Normalen (N,3) → das erweiterte Gauß-Bild, ein image2d mit (n_el, n_az).

Ein 2-D-Histogramm der Richtungen (Horn, *Extended Gaussian Images*, Proc. IEEE 72(12) 1984). Eine Karte von "wie viel Fläche in welche Richtung zeigt"; bei Objekten, in denen Ebenen dominieren, steht ein Gipfel in 1 Bin. Nicht umkehrbar -- es verwirft Richtungsauflösung bis zur Bin-Breite. Die verworfene Menge ist messbar: Der Winkel zwischen der Mittelrichtung des häufigsten Bins und der mittleren Eingangsrichtung ist der Quantisierungsfehler, beim Standard (36, 18) gemessen 3.7 Grad bei einer Bin-Breite von 10 Grad (selftest gibt ihn aus).

Die Elevations-Bins sind in sin(el) gleich (gleicher Raumwinkel). Gleiche Bins in Grad machen die Pole übermäßig fein und erzeugen einen falschen Gipfel, der "Flächen konzentrieren sich am Nordpol" behauptet.

★ Übergibt man eine Punktwolke von Positionen, gibt es keine Ausnahme. backends_typed.TYPE_TO_SORT faltet normals in points, daher unterscheiden weder der Evolver noch das Register die beiden. Dieses op sieht nur Richtungen an (es verwirft die Länge), also liefert es für (N,3)-Koordinaten plausibel ein Histogramm "der Richtung jedes Punkts vom Ursprung aus gesehen". Gemessen (2026-09-08, eine Kurve aus 200 Punkten vs. Normalen, die alle senkrecht nach oben zeigen): Die von null verschiedenen Bins ändern sich nur 1 → 12, das größte Bin 200 → 44, und die Summe ist in beiden Fällen 200. "Die Summe stimmt mit der Punktzahl überein, also ist es richtig" kann sie nicht unterscheiden. Mit fullseye.set_system("extra_checks", "on") werden Vektoren, die von der Einheitslänge abweichen, abgewiesen (siehe Raises unten).

Args:

normals: (N, 3).

n_az: Anzahl der Azimut-Bins (Standard 36 = 10-Grad-Schritte).

n_el: Anzahl der Elevations-Bins (Standard 18).

Returns:

(n_el, n_az) float64-Zählkarte (Zeilen = Elevation, Spalten = Azimut).

Raises:

ValueError: Bin-Anzahl unter 1 / über der Grenze / ungültige Eingabe.

ValueError: mit extra_checks='on', wenn Vektoren enthalten sind, deren Länge um mehr als 1e-6 von 1 abweicht

(fängt den Unfall ab, eine Punktwolke von Positionen als Normalen zu übergeben).

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.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

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

• representation_conversion — py -3.11 examples/representation_conversion.py

Typkompatible Folge-Operatoren (nehmen image2d als Eingabe)

keypoints_from_image2d

Gleiche Kategorie (direction)

normals_to_angles · angles_to_normals


*Provenance: reprconv.py — REPRCONV 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.