integrate_normals — 3D photometric op

• Data kinds: normalmap → image2d

• Call: import fullseye as fs; fs.ledger.integrate_normals(normals, mask=None) (implementation को सीधे call करना हो तो import photometric; photometric.integrate_normals(normals, mask=None), registry से लेना हो तो ops3d.get("integrate_normals"))

उपयोग

normal field → height field z, Frankot-Chellappa integration से। → z HxW (एक constant की स्वतंत्रता, औसत 0 को संदर्भ)।

प्रक्रिया: normals (H,W,3) को gradients p = -nx/nz, q = -ny/nz में बदलता है (|nz| < 1e-6 वाले pixels में nz को ±1e-6 से बदलकर शून्य से भाग से बचा जाता है), FFT domain में least-squares हल Z(wx,wy) = (-j·wx·P - j·wy·Q) / (wx² + wy²) निकालता है (DC component 0), inverse transform करके mean घटाकर उसे 0 करता है। mask (bool HxW) देने पर mask के बाहर के gradients को 0 करके फिर integrate किया जाता है (उस region को flat माना जाता है)। return value float64 (H,W) है।

सावधानियाँ:

• periodic boundary माना जाता है, इसलिए किनारे ऐसे distort होते हैं मानो image के ऊपर-नीचे और बाएँ-दाएँ जुड़े हों।

• absolute height तय नहीं होती (mean 0)। 1 pixel की grid spacing से integrate किया जाता है, इसलिए z भी pixel units में height होती है; असली आकार के लिए pixel pitch से गुणा करें।

• nz ≈ 0 (contour के पास, line of sight के समानांतर surfaces) पर gradient diverge होता है और लहरें आसपास फैलती हैं। इन्हें mask से हटाएँ या normals को पहले smooth करें।

कोई input validation नहीं है ((H,W,3) के अलावा कुछ भी अंदर की indexing में fail होता है)। surface_normals इसका inverse है; photometric_stereo के normals यहाँ देने पर shape (height field) मिलता है।

संदर्भ (sample data, साहित्य)

• 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 के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py

वे अगले ops जिनसे type जुड़ता है (image2d को input के रूप में लेते हैं)

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

इसी category के (photometric)

photometric_stereo · surface_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.