estimate_normals — 3D curvature op

• Datenarten: points → normals

• Aufruf: import fullseye as fs; fs.ledger.estimate_normals(points, k=25) (die Implementierung direkt: import curvature3d; curvature3d.estimate_normals(points, k=25); aus dem Register: ops3d.get("estimate_normals"))

Verwendung

Punktwolkennormalen, einheitlich nach außen gerichtet (vom Nachbarschaftsschwerpunkt weg). → (N,3).

Ablauf (pro Punkt, Python-Schleife): Mit cKDTree werden die k+1 Nachbarn einschließlich des Punktes selbst bestimmt (k auf N-1 gekürzt), und der kleinste Eigenvektor der Streumatrix local.T @ local der Nachbarkoordinaten mit dem Abfragepunkt als Ursprung wird zur Normalen (Einheitslänge). Orientierung: "umkehren, wenn das Skalarprodukt mit dem Nachbarschaftsschwerpunkt positiv ist" = ausgerichtet auf die vom Nachbarschaftsschwerpunkt abgewandte Seite.

• Punkte mit weniger als 5 Nachbarn liefern den festen Wert (0, 0, 1) (nicht geschätzt).

• Die Orientierung ist eine lokale Heuristik: Bei geschlossenen konvexen Formen zeigt sie nach außen, aber auf offenen Flächen, dünnen Platten und in konkaven Bereichen kann die Orientierung benachbarter Punkte voneinander abweichen (globale Konsistenz ist nicht garantiert). Für eine globale Ausrichtung durch orient_normals schicken oder von Anfang an estimate_oriented_normals verwenden. Für ein organized Tiefenbild ist normals_from_depth schneller und zum Blickpunkt orientiert.

• Rückgabewert ist float64 (N,3). k Standard 25. Deterministisch.

• Intern läuft dieselbe Berechnung wie bei principal_curvatures (auch die Normalenschätzung führt den Quadrikfit aus), daher ist es bei vielen Punkten langsam.

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blas_threads_and_memory — Warum Matrixzerlegungen langsam sind — BLAS-Threads, Caches, Speicherlayout

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)

• cylinder_axis_metrology — py -3.11 examples_3d/cylinder_axis_metrology.py

• feature_register — py -3.11 examples_3d/feature_register.py

• oriented_normals — py -3.11 examples_3d/oriented_normals.py

Typkompatible Folge-Operatoren (nehmen normals als Eingabe)

icp_point2plane · compute_fpfh · shot_descriptor · fuse_to_voxel · reflect · refract · normal_consistency · ransac_cylinder

Gleiche Kategorie (curvature)

principal_curvatures · mean_curvature · gaussian_curvature · shape_index


*Provenance: curvature3d.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.