wrapped_phase — 3D structured_light op

• 資料種類:images → image2d

• 呼叫: import fullseye as fs; fs.ledger.wrapped_phase(images) -> 'np.ndarray'(要直接呼叫實作,import fringe; fringe.wrapped_phase(images) -> 'np.ndarray';從台帳取用則 ops3d.get("wrapped_phase"))

用法

由 N 步相移條紋影像序列求 wrapped phase (-π, π]。

標準 N-step 公式 φ = atan2(Σ_n I_n sin(2πn/N), Σ_n I_n cos(2πn/N))。假定 N >= 3 的等間隔相移。回傳值為各像素包裹相位 (-π,π] 的 2D 陣列。

images:長度為 N 的序列(各為 2D [0,1] 影像)或 (N, H, W) 陣列。

計算:設相移量為等間隔 δ_n = 2πn/N(n = 0..N-1), 以 tensordot 求 s = Σ_n I_n sin δ_n、c = Σ_n I_n cos δ_n,再求 np.arctan2(s, c)。對於 I_n = a + b cos(φ - δ_n) 的模型(與 synthesize_fringes 相同的符號約定),φ 不經符號反轉即可還原。平均輝度 a 被消去,因此不受偏置影響。

輸入與驗證(ValueError):None / 無法轉換為 3-D (N, H, W) / N < 3 / 含 NaN、Inf。值域 [0, 1] 是前提而不做檢查(超出範圍計算也能通過)。

回傳值:(H, W) float64,值域 (-π, π]。s = c = 0 的像素(無條紋、調變為零)回傳 arctan2(0, 0) = 0,既不報錯也不是 NaN — 要挑選可信像素,請以 modulation(同模組的函式)查看調變度(decode_fringe 的 min_modulation 就是這樣做的)。

注意:若傳入相移量不等間隔、或張數與順序不對的影像序列, 不會報錯,而會得到「看似合理卻錯誤」的相位。下一步是 unwrap_phase_2d(空間展開)或 absolute_phase(以粗略絕對相位確定級次)。

背景知識指南(該運算子背後的物理與規範)

• depth_sensors — 深度感測器知識 —— 測距原理、實機數值、缺測的表現

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• structured_light — py -3.11 examples_3d/structured_light.py

• structured_light_scan — py -3.11 examples_3d/structured_light_scan.py

型別可銜接的下一個運算子(可接受 image2d 作為輸入)

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

同類別(structured_light)

unwrap_phase_2d · graycode_decode · decode_fringe · synthesize_fringes · absolute_phase · triangulate_column


*Provenance: fringe.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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