fit_zernike — 3D 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")

Verwendung

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.999999). 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.999999 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).

Raises ValueError: Eingabe nicht 2-D, kleiner als 2x2, NaN/Inf/float32-Überlauf oder Pupille ragt aus dem Bild.

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)

• curvilinear_proj — py -3.11 examples_3d/curvilinear_proj.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

fuse_to_voxel · mesh_select_lod

Gleiche Kategorie (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.