polarization_dolp_map — SPECULAR polarization op

• Data kinds: polsweep → image2d

• Call: import fullseye as fs; fs.ledger.polarization_dolp_map(images, angles_deg=(0.0, 45.0, 90.0, 135.0), max_violation_frac=0.0) (implementation को सीधे call करना हो तो import specularity; specularity.polarization_dolp_map(images, angles_deg=(0.0, 45.0, 90.0, 135.0), max_violation_frac=0.0), registry से लेना हो तो opsspecular.get("polarization_dolp_map"))

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

हर pixel पर degree of linear polarisation। → (H, W), [0, 1] में।

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

sqrt(S1^2 + S2^2) / S0, from the same sinusoid fit as polarization_separate. It answers the question that decides whether a polariser is worth mounting at all: 1 means the light at that pixel is fully linearly polarised and a crossed analyser extinguishes it completely, 0 means the polariser will only cost you a stop of exposure.

Being a ratio, it is invariant to exposure: scaling every frame by 1e-4, 1e4 or 1e8 moves it by at most 3.9e-16 (measured), which is what makes it comparable across a production line where the lamps age. Not *bit*- identical — the least-squares fit rounds differently at a different scale — and the difference between "invariant" and "bit-identical" is the kind of claim this library measures rather than asserts.

Pixels with zero total radiance have no degree of polarisation (every ratio would be 0/0) and are returned as 0.0 rather than as NaN; that is a convention, and it is stated here because a NaN spreading into a thresholding routine is exactly the silent failure this library refuses.

★Dark pixels (2026-11-09): "zero" is measured against the noise — a pixel whose fitted mean a0 = S0/2 is at most POLAR_DARK_K (3) × the noise of the modulation amplitude (σ̂·√(v₁+v₂), one σ̂ for the image from the residuals of an N > 3 sweep) is returned as 0.0 too, i.e. where the DoLP's own noise would be 1/3 or more. DoLP is a ratio, and clipped sensor noise in a dark region (σ 0.001 of a scene peaking at 1) used to come back as DoLP 1.0 — "completely polarised", the opposite of the truth — on 72 % of the dark pixels once *max_violation_frac* let the image through. A 0 here means "not defined", not "unpolarised" — use polarization_stokes_map's lit to tell them apart. With three angles there is no residual and only S0 = 0 is 0 (noise-only dark pixels are not screened). One σ̂ assumes stationary noise; shot noise grows with the signal, so the floor is set by the typical pixel.

Raises ValueError: as polarization_separate.

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

• specular_photometric 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 करते हैं)

• example_polarization_metal — py -3.11 examples/example_polarization_metal.py

• perf_polarization_analyze — py -3.11 examples/perf_polarization_analyze.py

• poc_polarization_specular — py -3.11 examples/poc_polarization_specular.py

• polarization_camera_pipeline — py -3.11 examples/polarization_camera_pipeline.py

• specular_photometric — py -3.11 examples/specular_photometric.py

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

polarization_render · deflectometry_render · deflectometry_phase_to_slope

इसी category के (polarization)

polarization_render · polarization_separate · polarization_stokes · polarization_stokes_map


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

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