structured_light op• Data kinds: image2d → image2d
• Call: import fullseye as fs; fs.ledger.unwrap_phase_2d(wrapped, mask=None) -> 'np.ndarray' (to call the implementation directly, import fringe; fringe.unwrap_phase_2d(wrapped, mask=None) -> 'np.ndarray'; from the registry, ops3d.get("unwrap_phase_2d"))
Unwrap a wrapped phase into a continuous one with skimage.restoration.unwrap_phase.
wrapped: output of wrapped_phase (2D). May contain NaN (treated as invalid pixels).
mask: optional. True = valid pixel (the intuitive direction, opposite to the numpy masked array convention).
NaN pixels and mask=False pixels are invalid, excluded from unwrapping, and returned as NaN in the output.
Returns: continuous phase (2D float). Invalid pixels are NaN. The ambiguity of a global offset (+2πm) remains.
Procedure: if there are no invalid pixels (non-finite wrapped ∪ mask == False), skimage.restoration.unwrap_phase(arr) is called directly. Otherwise the invalid pixels are filled with 0 and passed as a numpy.ma masked array (skimage excludes masked pixels from unwrapping), and the invalid pixels of the output are set back to NaN.
Validation: in an environment where scikit-image cannot be imported, RuntimeError (not ImportError). wrapped not 2-D, mask of a different shape, or all pixels invalid (no pixels to unwrap) raise ValueError.
Precondition (Itoh's condition): the true phase difference between adjacent valid pixels is less than π. At sharp steps, deep holes and occlusion boundaries a 2π jump is misjudged, and the whole region beyond it is shifted by 2πm. The relative order between regions split into islands by the mask is not determined (each island has an independent offset). When absoluteness is needed, use graycode_decode → absolute_phase with its per-pixel independent order determination.
Where to use it: wrapped_phase → this op → phase_to_height (a function of the same module, height = k (phase - ref_phase)). Unwrapping the reference plane by the same procedure and subtracting it cancels the global offset. decode_fringe does this chain in 1 call.
• depth_sensors — Depth sensors — ranging principles, real-device figures, how dropouts appear
• 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.
• structured_light — py -3.11 examples_3d/structured_light.py
image2d as input)fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade
structured_light)wrapped_phase · graycode_decode · decode_fringe · synthesize_fringes · absolute_phase · triangulate_column
*Provenance: fringe.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.