sfp_dolp_model — OPTICS shape_from_polarization op

• Data kinds: image2d → image2d

• Call: import fullseye as fs; fs.ledger.sfp_dolp_model(zenith_deg, refractive_index=1.5, model='specular') (implementation को सीधे call करना हो तो import sfpolar; sfpolar.sfp_dolp_model(zenith_deg, refractive_index=1.5, model='specular'), registry से लेना हो तो opsoptics.get("sfp_dolp_model"))

उपयोग

zenith angle के साथ specular (Fresnel reflection) या diffuse (Fresnel transmission) प्रकाश की degree of linear polarisation (image2d)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

*zenith_deg* is the angle between the surface normal and the viewing direction, in degrees, 0 <= zenith <= 90 (a scalar or an array of any shape — an (H, W) zenith map gives an (H, W) DoLP map).

model="specular": (R_s - R_p) / (R_s + R_p) for light reflected off a dielectric of index *refractive_index*. It rises from 0 at normal incidence to exactly 1 at Brewster's angle atan(n) (R_p = 0) and falls back to 0 at grazing incidence — so one DoLP value has two zenith angles.

model="diffuse": (T_p - T_s) / (T_p + T_s) for light scattered inside the body and refracted out through the surface. It rises monotonically from 0 to (n^2 - 1)/(n^2 + 1) at 90 degrees (0.385 for n = 1.5) — weaker, but one value has one angle.

Returns a float64 array of the input's shape (a 0-d array for a scalar).

Raises ValueError: zenith outside [0, 90] or non-finite; *refractive_index* not a finite real > 1; unknown *model*.

*refractive_index* (here and in every op of this module) may also be a material name of the shared table materials (e.g. "N-BK7", "PMMA", "WATER"): its index at the d line (587.56 nm) is used. Metals and materials that absorb there are refused.

पूरी family का input contract (fail-closed)

optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।

• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।

• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।

• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।

• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।

• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (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 के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

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

• poc_shape_from_polarization — py -3.11 examples/poc_shape_from_polarization.py

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

fraunhofer_pattern · pupil_psf · pupil_blur · psf_to_mtf · edge_spread · veiling_glare_index · emva_pair_statistics · emva_defect_pixels

इसी category के (shape_from_polarization)

dolp_to_zenith · aolp_to_azimuth · sfp_render · sfp_normals · sfp_disambiguate · sfp_estimate_index · sfp_height


*Provenance: sfpolar.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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