unwrap_phase_2d — 3D structured_light op

• Data kinds: image2d → image2d

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

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

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 लौटाया जाता है।

crop_valid: वैकल्पिक (डिफ़ॉल्ट False = पूरा फ़्रेम)। True होने पर केवल वैध पिक्सेलों का परिबद्ध आयत skimage को दिया जाता है और बाहर NaN ही लौटता है (कई अवैध पिक्सेल वाली फ़्रेम-युक्त छवियों के लिए तेज़ वैकल्पिक पथ; वैध पिक्सेलों की कला पूरे फ़्रेम की प्रक्रिया से प्रति द्वीप 2π के पूर्णांक गुणज तक मेल खाती है; यह विस्थापन skimage के संस्करण के साथ बदल सकता है)।

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 (उसी मॉड्यूल का फ़ंक्शन, height = k (phase - ref_phase))। ★अनरैप का वैश्विक ऑफ़सेट 2πm हर अनरैप में अलग तय होता है (आरंभिक शाखा इनपुट फ़ेज़ क्षेत्र पर निर्भर है), इसलिए संदर्भ तल और मापन तल को अलग-अलग अनरैप करके घटाने से यह रद्द नहीं होता (2026-11-05 तक यहाँ "रद्द होता है" लिखा था, पर 60 में से 24 स्थितियों में ऊँचाई k·2π से खिसकी)। संदर्भ घटाने के लिए decode_fringe का ref_phase प्रयोग करें —— यह पहले रैप्ड फ़ेज़ों का अंतर लेता है और केवल 1 बार अनरैप करता है।

खाली इनपुट (wrapped में 0 तत्व) पर ValueError उठता है।

पृष्ठभूमि 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 · fringe_ftp_phase · depth_from_focus · 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.