moment_invariant op• Datenarten: points → descriptor
• Aufruf: import fullseye as fs; fs.ledger.moment_invariants(points) -> 'np.ndarray' (die Implementierung direkt: import moments3d; moments3d.moment_invariants(points) -> 'np.ndarray'; aus dem Register: ops3d.get("moment_invariants"))
Ein gegen Translation, Rotation und Skalierung invarianter Formmerkmalsvektor (im Stil von Sadjadi–Hall, plus radiale Verteilungen höherer Ordnung).
★Die Eingabe ist eine (N,3)-Punktwolke. Wenn man gleichartige Größen aus einer 2-D-Region (Bild) möchte, verwendet man statt dieses op die HALCON-artigen moments_region_2nd_invar / moments_region_central_invar / moments_region_3rd_invar (Hu-Momente). Die Namen sind ähnlich und leicht zu verwechseln; bei Übergabe von (H,W) schlägt es mit "points must be a point cloud of shape (N,3)" fehl (2026-09-09, beim Schreiben von poc_rotation_invariance_audit tatsächlich passiert).
Rezept:
1. Schwerpunktzentrierung (entfernt die Translation).
2. Skalennormierung durch Division durch den RMS-Radius R = sqrt(mean‖p-c‖²) (R→1). Damit hängen die normierten zentralen Momente 2. Ordnung nicht von einer gleichmäßigen Skala s ab.
3. Die Hauptinvarianten (Koeffizienten des charakteristischen Polynoms) der normierten Kovarianz C̃ auflisten:
λ̂1 >= λ̂2 >= λ̂3 … Eigenwerte von C̃ (= normierte Hauptmomente 2. Ordnung,
Σλ̂ = 1, rotationsinvariant)
J2 = λ̂1λ̂2 + λ̂1λ̂3 + λ̂2λ̂3 (Sadjadi–Hall 2. Invariante = Summe der 2×2-Hauptminoren)
J3 = λ̂1λ̂2λ̂3 (3. Invariante = det C̃)
4. Normiertes radiales Moment 4. Ordnung m4 = mean(‖p̂-c‖⁴) (= mean(r⁴)/mean(r²)²). r = Abstand vom Schwerpunkt, daher rotations- und translationsinvariant, nach RMS-Normierung skaleninvariant.
Der zurückgegebene Vektor ist [λ̂1, λ̂2, λ̂3, J2, J3, m4] (Länge 6). Die 1. Invariante J1 = Σλ̂ ist nach der Normierung immer 1 und trägt nichts zur Unterscheidung bei, daher wird sie weggelassen. J2,J3 sind symmetrische Funktionen der Eigenwerte (redundant), werden aber zur Kompatibilität mit der algebraischen Invariantensignatur nach Sadjadi–Hall mit angegeben.
Aufschlüsselung der Trennschärfe (honest):
• λ̂1,λ̂2,λ̂3 (und die symmetrischen Funktionen J2,J3) stammen nur aus den Momenten 2. Ordnung (Kovarianzeigenwerten) und haben nur 2 unabhängige Freiheitsgrade, die Seitenverhältnisse der Hauptachsen. Damit allein lassen sich Formen, deren 2. Ordnung isotrop ist (solid cube und solid sphere haben beide λ̂≈(1/3,1/3,1/3)), nicht unterscheiden.
• m4 ist das Moment 4. Ordnung der Radialverteilung und erfasst Formunterschiede höherer Ordnung, die in 2. Ordnung verschwinden. Eine gleichmäßige solid sphere hat m4=75/63≈1.190, ein gleichmäßiger solid cube m4=19/15≈1.267; diese unterscheiden sich, sodass beide getrennt werden können.
Eine Kugel ergibt etwa (1/3, 1/3, 1/3, 1/3, 1/27, 1.190), ein langer dünner Stab nähert sich (≈1, ≈0, ≈0, ≈0, ≈0, groß).
np.ndarray, shape (6,)
Merkmalsvektor, invariant gegenüber Translation, Rotation und Skala.
Ergänzungen:
• Eingabe ist (N,3), N >= 2. Ungültige Form, nicht endliche Werte oder lauter identische Punkte (Streuung 0 nach Zentrierung) lösen ValueError aus. Der Entartungstest ist skalenrelativ (rms <= 1e-12 × max|centered|), daher werden Punktwolken mit lediglich winzigen Koordinaten nicht abgewiesen.
• Rückgabewert ist float64 (6,). λ̂ ist bei 0 begrenzt (Clipping), Σλ̂ = 1.
• Invariant nur gegenüber Translation, Rotation und gleichmäßiger Skala. Auch gegenüber Spiegelung invariant (Eigenwerte und Radialverteilung ändern sich durch Spiegelung nicht), daher sind Spiegelbilder nicht unterscheidbar. Ungleichmäßige Skalierung und Bias in der Punktdichte (dichte/dünne Abtastung) verändern die Werte.
• Für dichteempfindliche Anwendungen die Dichte vorab mit voxel_grid_downsample ausgleichen. Zum Vergleich shape_distance (Register-op, Abstand zwischen Deskriptorvektoren gleicher Länge).
• 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.
• moment_invariants — py -3.11 examples_3d/moment_invariants.py
descriptor als Eingabe)fuse_to_voxel · shape_distance
moment_invariant)principal_moments · central_moments · inertia_tensor
*Provenance: moments3d.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.