polar_unwrap — 3D curvilinear op

• Data kinds: image2d → image2d

• Call: import fullseye as fs; fs.ledger.polar_unwrap(image, center=None, r_in=0.0, r_out=None, ntheta=360, nr=64, device='cpu') (to call the implementation directly, import match3d; match3d.polar_unwrap(image, center=None, r_in=0.0, r_out=None, ntheta=360, nr=64, device='cpu'); from the registry, ops3d.get("polar_unwrap"))

• GPU: this op has a GPU path (device="cuda")

Usage

Unwrap an image's annulus or disc into a (θ × r) rectangle (industrial: inspecting labels, rings and bodies of revolution).

Stretches features arranged along the circumference "vertically" so that ordinary 2D methods (line search/correlation) can be applied. grid_sample. The θ axis has no endpoint (angle of row k = k·2π/ntheta) = a periodic grid that does not sample 0° and 360° twice (meets the premise of FFT/circular correlation along θ. Fixed 2026-08-30; the old version had first row = last row).

Raises ValueError: input not 2-D, smaller than 2x2, or NaN/Inf/float32 overflow.

Args: center=(cy, cx) is in (row, column) order (default is the image centre ((H−1)/2, (W−1)/2)). r_in-r_out (pixels, default min(H,W)/2 − 1) is divided into nr equal parts, the angle into ntheta equal parts. Output (ntheta, nr) float32: angle of row k θ = k·2π/ntheta, radius of column j r = r_in + j·(r_out − r_in)/(nr−1), sample points are (cy + r sinθ, cx + r cosθ) (θ=0 is the +column direction; as θ increases it turns toward the +row direction). Outside the image is filled with 0 (bilinear).

Downstream: line search along the row direction (θ) and ncc_locate, rotation angle by 1-D correlation along θ.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

Runnable examples (verified samples that actually call this op)

• curvilinear_proj — py -3.11 examples_3d/curvilinear_proj.py

Ops the type connects to (they accept image2d as input)

fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · fit_zernike · matcap_shade · antialias

Same category (curvilinear)

cylinder_unwrap · fit_zernike


*Provenance: match3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.