unwrap_phase_2d — 3D structured_light op

• Data kinds: image2d → image2d

• Call: import fullseye as fs; fs.ledger.unwrap_phase_2d(wrapped, mask=None) -> 'np.ndarray' (implementation को सीधे call करना हो तो import fringe; fringe.unwrap_phase_2d(wrapped, mask=None) -> 'np.ndarray', registry से लेना हो तो ops3d.get("unwrap_phase_2d"))

उपयोग

wrapped phase को skimage.restoration.unwrap_phase से continuous phase में unwrap करता है।

wrapped: wrapped_phase का output (2D)। इसमें NaN हो सकते हैं (invalid pixels माने जाते हैं)।

mask: optional। True = valid pixel (numpy masked array की परंपरा से उल्टी, सहज दिशा)।

NaN pixels और mask=False pixels को invalid मानकर unwrapping से बाहर रखा जाता है, और output में NaN लौटाया जाता है।

return value: continuous phase (2D float)। invalid pixels NaN होते हैं। global offset (+2πm) की अनिश्चितता बनी रहती है।

प्रक्रिया: अगर कोई invalid pixel (wrapped के non-finite ∪ mask == False) न हो, तो skimage.restoration.unwrap_phase(arr) सीधे call किया जाता है। हों, तो invalid pixels को 0 से भरकर numpy.ma के masked array के रूप में दिया जाता है (skimage masked pixels को unwrapping से बाहर रखता है), और output के invalid pixels को फिर NaN कर दिया जाता है।

validation: जिस environment में scikit-image import न हो सके वहाँ RuntimeError (ImportError नहीं)। wrapped 2-D न हो, mask का shape अलग हो, या सभी pixels invalid हों (unwrap करने को कोई pixel न हो) तो ValueError।

पूर्वधारणा (Itoh की शर्त): पड़ोसी valid pixels का असली phase अंतर π से कम हो। तीखे steps, गहरे holes और occlusion boundaries पर 2π jump गलत समझा जाता है, और उसके आगे का पूरा region 2πm खिसक जाता है। mask से islands में बँटे regions के बीच relative order तय नहीं होता (हर island का अपना स्वतंत्र offset)। absoluteness चाहिए तो graycode_decode → absolute_phase का हर pixel के लिए स्वतंत्र order निर्धारण इस्तेमाल करें।

उपयोग: wrapped_phase → यह op → phase_to_height (इसी module का function, height = k (phase - ref_phase))। reference surface को उसी प्रक्रिया से unwrap करके घटाने पर global offset कट जाता है। decode_fringe यह पूरी chain 1 call में करता है।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• depth_sensors — Depth sensors — ranging के सिद्धांत, असली devices के आँकड़े, dropouts कैसे दिखते हैं

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• structured_light — py -3.11 examples_3d/structured_light.py

वे अगले ops जिनसे type जुड़ता है (image2d को input के रूप में लेते हैं)

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

इसी category के (structured_light)

wrapped_phase · graycode_decode · decode_fringe · synthesize_fringes · absolute_phase · triangulate_column


*Provenance: fringe.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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