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

Verwendung

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.

Parameters

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

Returns

(angle_deg, n_iters) : (float, int) Verfeinerter Winkel (deg) und Anzahl der ausgeführten Iterationen.

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)

• refinement — py -3.11 examples_3d/refinement.py

Typkompatible Folge-Operatoren (nehmen angle als Eingabe)

fuse_to_voxel

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