photometric op• 資料種類:images → normalmap
• 呼叫: import fullseye as fs; fs.ledger.photometric_stereo(images, lights, mask=None, normalize=True, *, lit_only=False, lit_thresh=0.001)(要直接呼叫實作,import photometric; photometric.photometric_stereo(images, lights, mask=None, normalize=True, *, lit_only=False, lit_thresh=0.001);從台帳取用則 ops3d.get("photometric_stereo"))
• 經台帳呼叫的回傳值: fullseye.ledger.photometric_stereo(...) 只回傳宣告的 out 型別 normalmap 的值(底層函式還會回傳輔助資訊)。需要被捨棄的部分時,請用 fullseye.ledger.photometric_stereo.raw(...),或直接呼叫 photometric.photometric_stereo。
Lambert 光度立體:由已知光源方向的 N 張圖恢復法線與反照率。→ (normals HxWx3, albedo HxW)。
I_n = albedo * max(N·L_n, 0)。在每個像素以最小平方 g = pinv(L) @ I 求解 g = albedo*N, albedo=|g|, normal=g/|g|。需要 N>=3。albedo~0 或 mask 外的像素 normal=(0,0,1)。normalize=True 時將光源向量正規化為單位方向(與 render_lambertian 相同的約定 = 反照率絕對值能正確得出)。若使用帶強度權重的光源,請設 normalize=False,合成端也統一使用原始向量。
lit_only(2026-09-04 新增):去除附著陰影(attached shadow)後求解。模型的 max(·, 0) 是非線性的,把 N·L < 0 的觀測(真值為 0)直接放進線性最小平方會使解產生偏差 ―― 實測:在既無陰影也無 AO 的球上中位數為 9°,只用點亮的光源求解則為 0.000°。預設為 False(不改變以往行為)。設為 True 時對每個像素只用 I > lit_thresh 的光源重新求解。把點亮模式相同的像素歸為一組, 以 1 次偽逆處理,因此額外成本大致只與光源數對應的模式數成正比(6 燈時最多 64 組)。點亮光源少於 3 個的像素退回全光源的解(fail-open:
與其把無法求解的像素設為 NaN,不如保留即使有偏差的值,這樣下游的積分不會崩壞)。
lit_thresh:視為「點亮」的輝度下限。應設在拍攝雜訊之上。
• 範例資料目錄(下載 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)surface_normals · integrate_normals · render_lambertian
*Provenance: photometric.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.