curvilinear op• Datenarten: image2d → table
• Aufruf: import fullseye as fs; fs.ledger.fit_zernike(disk_image, n_max=6, device='cpu', nr=48, nt=72, center=None, radius=None) (die Implementierung direkt: import match3d; match3d.fit_zernike(disk_image, n_max=6, device='cpu', nr=48, nt=72, center=None, radius=None); aus dem Register: ops3d.get("fit_zernike"))
• GPU: Dieser Operator hat einen GPU-Pfad (device="cuda")
Ein Scheibenbild → Zernike-Koeffizienten (die Polarkoordinaten-Flächenanpassung der Optik und Wellenfrontmesstechnik). Liefert {(n,m): coef}.
Reduziert eine Fläche auf einer Kreisscheibe (Wellenfrontaberration, Linsenform) mit orthogonalen Polynomen auf wenige Koeffizienten. tilt/defocus/astigmatism/ coma/spherical usw. entsprechen bestimmten (n,m), und Rotation mischt m (Band = rotationsinvariant).
Die Pupille (Einheitskreisscheibe ρ=1) liegt standardmäßig in der Bildmitte ((H-1)/2, (W-1)/2) mit Radius min(H, W)/2 - 1 Pixel. Weicht die Pupille im Bild davon ab, center=(row, col) und radius (Pixel) übergeben —— ohne das wird die Radiusabweichung direkt zum Leck in die niederen Moden (liest man bei 129×129 ein reines defocus mit Pupillenradius (H-1)/2 mit den Standardwerten, ergibt sich (2,0)=0.984 / (0,0)=−0.015; mit radius=(H-1)/2 0.999998). Ein center / radius, dessen Pupillenkreis aus dem Bild ragt, ist ein ValueError.
Honest-Offenlegung (korrigiert 2026-10-07): Früher stand hier "Übersprechen von bis zu ~10% durch diskrete Abtastung (nr=48, nt=72), das mit höherem nr/nt sinkt", doch die Ursache war nicht die Auflösung. Stimmen Radius und Mitte der Pupille und setzt sich das Bild auch außerhalb der Pupille fort, kehren die Koeffizienten mit den Standardwerten von nr/nt auf fast 1 zurück (0.999998 bei 129×129). Die tatsächlichen Ursachen des Lecks sind
(1) die oben genannte Abweichung von Pupillenradius/-mitte (höheres nr/nt senkt sie nicht einmal um 1 Größenordnung) und (2) dass in Bildern, die außerhalb der Pupille 0 sind,
der äußerste Ring (ρ=1) auf dem Rand liegt und die bilineare Interpolation die 0 von außen einsaugt (gemessen in examples/poc_zernike_aberrations.py).
★Korrektur 2026-10-14 (Flächengewichte): Das Polargitter (ρ gleichmäßig von 0 bis 1) wurde früher ungewichtet nach kleinsten Quadraten gelöst. Jeder Ring hat gleich viele Abtastwerte, also zählte die kleine Mittelfläche zu stark, und abgeschnittene höhere Ordnungen leckten in niedrigere (Z80 + 0.3·Z20 mit n_max=4 gelesen ergab Z40 = 0.39; die wahre Projektion ist 0). Jetzt liegt ρ auf nr Gauß–Legendre-Knoten (ohne 0 und 1) und gelöst wird mit dem Gewicht w_i·ρ_i (Flächenelement ρ dρ dθ) —— für ein Polynom im Band ist die Projektion exakt. Da kein Knoten auf ρ = 1 liegt, wird auch weniger von der 0 außerhalb der Pupille eingesaugt (verschwinden tut es nicht: der bilineare Träger überspannt den Rand weiterhin).
Raises ValueError: Eingabe nicht 2-D, kleiner als 2x2, NaN/Inf/float32-Überlauf oder Pupille ragt aus dem Bild.
• 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.
• curvilinear_proj — py -3.11 examples_3d/curvilinear_proj.py
table als Eingabe)fuse_to_voxel · mesh_select_lod
curvilinear)polar_unwrap · cylinder_unwrap
*Provenance: match3d.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.