photometric op• Data kinds: normalmap → image2d
• Call: import fullseye as fs; fs.ledger.render_lambertian(normals, albedo, light, ambient=0.0) (to call the implementation directly, import photometric; photometric.render_lambertian(normals, albedo, light, ambient=0.0); from the registry, ops3d.get("render_lambertian"))
Normals + albedo + light direction → a Lambertian image (inspection-sample generation / GT verification / the forward model of inverse rendering). → HxW.
I = albedo * (max(n·L, 0) + ambient). light is a (3,) light-direction vector, normalised internally to unit length (its length has no effect as intensity). Pixels with n·L < 0 are clipped to 0 (attached shadow). ambient is a constant added uniformly regardless of the normal, and the albedo multiplies it (default 0). normals are (H,W,3) normals (assumed unit length, not normalised), albedo is (H,W) or a broadcastable array / scalar. Returns float32 (H,W). The upper bound is albedo * (1 + ambient); there is no clipping to [0,1]. There is no input validation. It is exactly the forward model of photometric_stereo (the light-normalisation convention corresponds to normalize=True), so it can be used for round-trip verification: re-synthesise from the recovered normals and albedo and compare with the original images. Specular reflection, interreflection and cast shadows are not included.
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• photometric_stereo — py -3.11 examples_3d/photometric_stereo.py
• render_shade — py -3.11 examples_3d/render_shade.py
image2d as input)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 · integrate_normals
*Provenance: photometric.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.