refine op• Datenarten: voxel × voxel × angle → angle
• Aufruf: import fullseye as fs; fs.ledger.refine_rotation_z(scene, template, init_angle_deg=0.0, device='cpu', iters=40, tol=0.001, max_step_deg=5.0) (die Implementierung direkt: import match3d; match3d.refine_rotation_z(scene, template, init_angle_deg=0.0, device='cpu', iters=40, tol=0.001, max_step_deg=5.0); aus dem Register: ops3d.get("refine_rotation_z"))
• Rückgabewert über das Register: fullseye.ledger.refine_rotation_z(...) liefert nur den Wert des deklarierten Out-Typs angle (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.refine_rotation_z.raw(...) oder rufe match3d.refine_rotation_z direkt auf.
• GPU: Dieser Operator hat einen GPU-Pfad (device="cuda")
Gauß-Newton-Verfeinerung des Rotationswinkels um z (Lucas-Kanade auf SSD, ein Parameter).
Nachgelagerter Verfeinerer, der eine grobe z-Achsen-Rotationsschätzung (Klasse ±3°) aus Fourier-Mellin u. Ä. präzisiert, indem er die SSD nur über den Drehwinkel θ minimiert. Er nimmt scene ≈ rotate_z(template, θ_true) an und sucht das θ, bei dem warp_z(template, θ) mit scene übereinstimmt. Der zurückgegebene Winkel hat dasselbe Vorzeichen wie match_logpolar_z (scene = template um θ gedreht).
Formulierung: Das Residuum r(θ)=T_warp(θ)−S wird in θ linearisiert. Das Steepest-Descent-Image der Rotation (analytische Jacobi-Matrix) ergibt sich aus dem zentrierten Gitter (X=W−cx, Y=H−cy) und dem räumlichen Gradienten (gx,gy) des gewarpten Templates als J = ∂T_warp/∂θ = (−gx·Y + gy·X) (pro rad). Das GN-Update mit 1 Parameter ist Δθ = −(JᵀWr)/(JᵀWJ). Durch die Rotation mit 0 gefüllte Ecken werden über die valid-Maske W ausgeschlossen. Der Schritt wird durch max_step_deg begrenzt, um Divergenz zu verhindern.
Gemessen (48³ asymmetrisches Volume, CPU, scene mit anderem Interpolator scipy order=3 erzeugt = Vermeidung des Inverse Crime):
clean-Fehler ~0.0006°, 5% Rauschen 0.009°, 10% Rauschen 0.017° (alle <0.3°). Der Fangbereich beträgt mindestens ±10°, Konvergenz in 3-5 Iterationen, ~12ms. Gegenüber der direkten Verwendung der Grobschätzung ±3° (Fehler 3°) etwa ~5000-fach besser.
scene : array_like (D,H,W) Referenz-Volume (an diese Pose wird template angepasst).
template : array_like (D,H,W) Template-Volume, das gedreht wird, um zu scene zu passen. Gleiches Gitter, gleiches Zentrum.
init_angle_deg : float Grob geschätzter Winkel (deg). Startwert aus Fourier-Mellin u. Ä.
device : str "cpu" / "cuda". Geräteunabhängig.
iters : int Maximale Anzahl der Iterationen.
tol : float Abbruch als konvergiert, wenn |Δθ| (deg) diesen Wert unterschreitet.
max_step_deg : float Obergrenze des Winkelschritts pro 1 Iteration (deg, verhindert Divergenz).
(angle_deg, n_iters) : (float, int) Verfeinerter Winkel (deg) und Anzahl der ausgeführten Iterationen.
• 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.
• refinement — py -3.11 examples_3d/refinement.py
angle als Eingabe)refine)refine_peak_newton · refine_translation_lk · refine_lm · icp_point2point_3d · icp_point2plane
*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.