metrics op• Datenarten: points × points → signal
• Aufruf: import fullseye as fs; fs.ledger.m3c2_distance(a, b, cores, normals, radius, max_depth=None, min_points=4) (die Implementierung direkt: import metrics3d; metrics3d.m3c2_distance(a, b, cores, normals, radius, max_depth=None, min_points=4); aus dem Register: ops3d.get("m3c2_distance"))
• Rückgabewert über das Register: fullseye.ledger.m3c2_distance(...) liefert nur den Wert des deklarierten Out-Typs signal (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.m3c2_distance.raw(...) oder rufe metrics3d.m3c2_distance direkt auf.
Misst die Differenz zwischen Punktwolken aus 2 Zeitpunkten in Normalenrichtung (M3C2). → die 2 Werte (distance, lod).
Die Nächster-Nachbar-Distanz (chamfer / C2C) ist "die Distanz zum nächstgelegenen Punkt", daher zählt sie auf einer geneigten Fläche sogar die Verschiebung entlang der Fläche als Distanz. Bei der Änderungserkennung von Gelände und Bauwerken ist das die Hauptursache für "falsche Änderungen, die schon durch bloßes Nachmessen erkannt werden" (poc_structure_4d_deterioration
gemessen: ohne jede Verschlechterung, nur nachgemessen, ergibt sich ein C2C-Median von 21.07 mm, in Normalenrichtung 0.55 mm).
M3C2 (Lague 2013) schneidet für jeden Core-Punkt beide Wolken mit einem Zylinder, dessen Achse die Normale n ist (Radius radius, Länge max_depth), projiziert jeden Punkt auf n und gibt die Differenz der Mittelwerte zurück. Positiv ist die Seite, auf die n zeigt — das Vorzeichen bedeutet direkt "zugenommen / abgenommen".
Args:
a: Punktwolke zum Zeitpunkt 1 (Na,3).
b: Punktwolke zum Zeitpunkt 2 (Nb,3).
cores: Messorte (M,3) (darf eine Teilmenge von a oder ein separat gelegtes Gitter sein).
normals: Normale je Core (M,3) (muss nicht normiert sein. Ihr Vorzeichen bestimmt das Vorzeichen des Ergebnisses).
radius: Zylinderradius (der Mittelungsbereich um den Core. Größer als die Rauheit der Fläche und kleiner als
die zu messende Struktur wählen).
max_depth: halbe Zylinderlänge. None bedeutet keine Begrenzung in Achsrichtung.
min_points: Ein Core, der auf einer Seite nicht so viele Punkte hat, liefert nan (Standard 4).
Returns:
(distance, lod): beide (M,) float64. distance ist die vorzeichenbehaftete Differenz
in Normalenrichtung, lod (level of detection) ist
1.96·sqrt(σa²/na + σb²/nb) — eine Differenz, die diesen Wert nicht übersteigt, ist von Rauschen nicht zu unterscheiden.
Cores mit zu wenigen Punkten erhalten bei beiden nan.
★Über das Register (fullseye.ledger.m3c2_distance) wird nur distance, der deklarierte out-Typ,
zurückgegeben. Wird auch lod benötigt, fullseye.ledger.m3c2_distance.raw(...) verwenden.
Raises:
ValueError: wenn Punktwolken / cores nicht (N,3) oder leer sind, die Anzahl der normals nicht zu cores
passt, radius <= 0, max_depth <= 0 oder min_points < 1.
Grenzen (honest): (1) Die Normalen gibt der Aufrufer vor — das Standardvorzeichen von estimate_point_normals ist schwerpunktbezogen, daher kippt das Vorzeichen von Ort zu Ort, wenn die Orientierung nicht mit viewpoint oder orient_normals vereinheitlicht wird. (2) lod betrachtet nur das Rauschen und enthält nicht das Residuum der Registrierung (Lagues Originalarbeit addiert den Registrierungsfehler als eigenen Term).
(3) An Rändern, wo nur wenige Punkte in den Zylinder fallen, ergibt sich nan — es wird nicht 0 zurückgegeben, um es
wie "keine Änderung" aussehen zu lassen.
Reference (public): D. Lague, N. Brodu, J. Leroux, "Accurate 3D comparison of complex topography with terrestrial laser scanner: application to the Rangitikei canyon (N-Z)", ISPRS Journal of Photogrammetry and Remote Sensing 82 (2013) 10-26.
• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)
• measurement_uncertainty — Messunsicherheit und Kalibrierung — was nötig ist, um zu behaupten, dass man misst
• 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.
• metrics_eval — py -3.11 examples_3d/metrics_eval.py
signal als Eingabe)metrics)chamfer_distance · hausdorff_distance · fscore · rmse_correspondence · normal_consistency · voxel_iou · pose_error
*Provenance: metrics3d.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.