photometric op• Data kinds: image2d → normalmap
• Call: import fullseye as fs; fs.ledger.surface_normals(z) (implementation को सीधे call करना हो तो import photometric; photometric.surface_normals(z), registry से लेना हो तो ops3d.get("surface_normals"))
height field z (HxW) → unit normals (H,W,3)। n ∝ (-dz/dx, -dz/dy, 1)। depth→normal का forward conversion।
np.gradient के central differences (किनारों पर one-sided differences) से row direction का dz/dy और column direction का dz/dx लेकर, n = (-dz/dx, -dz/dy, 1) को length 1 पर normalise करता है (+1e-12 से शून्य से भाग से बचा जाता है)। grid spacing को 1 pixel माना जाता है, इसलिए अगर z की unit pixel से अलग है (mm आदि) तो पहले z / pixel pitch में बदलना ज़रूरी है, वरना slope असल से ज़्यादा/कम आता है। normal का z component हमेशा positive होता है (camera की ओर)। return value float32 (H,W,3) है; 3rd axis में (x, y, z) components हैं, x column direction में और y row direction में। कोई input validation नहीं है; 2-D के अलावा कुछ देने पर np.gradient के unpacking में failure होता है। यह integrate_normals का inverse है और photometric_stereo के output वाला ही normal convention इस्तेमाल करता है, इसलिए इसे सीधे render_lambertian को देकर shaded image synthesize की जा सकती है।
• 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 के स्रोत।
• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py
normalmap को input के रूप में लेते हैं)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 operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.