surface_normals — 3D photometric op

• 資料種類:image2d → normalmap

• 呼叫: import fullseye as fs; fs.ledger.surface_normals(z)(要直接呼叫實作,import photometric; photometric.surface_normals(z);從台帳取用則 ops3d.get("surface_normals"))

用法

高度場 z(HxW)→ 單位法線 (H,W,3)。n ∝ (-dz/dx, -dz/dy, 1)。深度→法線的正向變換。

以 np.gradient 的中心差分(邊緣為單側差分)求列方向的 dz/dy 和行方向的 dz/dx, 將 n = (-dz/dx, -dz/dy, 1) 正規化為長度 1(以 +1e-12 避免除以零)。網格間距視為 1 像素,因此當 z 的單位與像素不同(mm 等)時,若不事先換算為 z / 像素間距,傾斜會比實際偏強/偏弱。法線的 z 分量始終為正(朝向相機)。回傳值為 float32 的 (H,W,3),第 3 軸為 (x, y, z) 分量,x 沿行方向, y 沿列方向。沒有輸入驗證,傳入非 2-D 資料時會在 np.gradient 的展開處失敗。它相當於 integrate_normals 的逆變換,且與 photometric_stereo 的輸出法線約定相同, 因此可直接傳給 render_lambertian 合成陰影影像。

參考(範例資料、文獻)

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

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

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

• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py

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

fuse_to_voxel · render_shaded · phong_shade · matcap_shade · brdf_lommel_seeliger · brdf_hapke · bump_normals_fbm · integrate_normals

同類別(photometric)

photometric_stereo · integrate_normals · render_lambertian


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

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