photometric op• 資料種類:normalmap → image2d
• 呼叫: import fullseye as fs; fs.ledger.integrate_normals(normals, mask=None)(要直接呼叫實作,import photometric; photometric.integrate_normals(normals, mask=None);從台帳取用則 ops3d.get("integrate_normals"))
法線場 → 高度場 z,用 Frankot-Chellappa 積分。→ z HxW(常數項自由,以平均 0 為基準)。
步驟:把法線 (H,W,3) 轉為梯度 p = -nx/nz、q = -ny/nz(|nz| < 1e-6 的像素把 nz 替換為 ±1e-6 以避免除以零),在 FFT 域中求最小平方解 Z(wx,wy) = (-j·wx·P - j·wy·Q) / (wx² + wy²)(直流分量為 0),逆變換後減去平均值使其為 0。給出 mask (bool HxW) 時,先把 mask 外的梯度設為 0 再積分(該區域被當作平坦處理)。回傳值為 float64 的 (H,W)。
注意事項:
• 由於假定週期邊界,邊緣會像影像上下、左右相連那樣發生畸變。
• 絕對高度無法確定(平均為 0)。以 1 像素的網格間距積分,因此 z 也是像素單位的高度,換算為實際尺寸需乘以像素間距。
• nz ≈ 0(輪廓附近、與視線平行的面)處梯度發散,波紋會擴散到周圍。請以 mask 排除或事先平滑法線。
沒有輸入驗證((H,W,3) 以外會在內部索引處失敗)。surface_normals 是其逆變換, 把 photometric_stereo 的法線傳到這裡即可得到形狀(高度場)。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py
image2d 作為輸入)fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade
photometric)photometric_stereo · surface_normals · render_lambertian
*Provenance: photometric.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.