polarization_demosaic_color — OPTICS polarization op

• Data kinds: image2d → rgbvolume

• Call: import fullseye as fs; fs.ledger.polarization_demosaic_color(raw, layout=((90.0, 45.0), (135.0, 0.0)), bayer='RGGB') (implementation को सीधे call करना हो तो import optics; optics.polarization_demosaic_color(raw, layout=((90.0, 45.0), (135.0, 0.0)), bayer='RGGB'), registry से लेना हो तो opsoptics.get("polarization_demosaic_color"))

उपयोग

color polarisation-sensor mosaic (Sony IMX250MYR family, 4x4 block = 2x2 Bayer block जिसकी हर colour site खुद polarisers का 2x2 block है) को चार RGB images में बाँटता है: POLARIZATION_SWEEP_ANGLES क्रम में (4, H, W, 3), हर channel को full resolution तक interpolate किया गया। इसे rgbvolume sort ले जाता है (RGB की चार "slices")।

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

Two closed forms composed, no new estimate: (1) the pixels at each of the four polariser positions form a plain Bayer mosaic at half resolution, so each is demosaicked with gfx2d.raw_demosaic_bilinear and written back to its positions — after which every pixel has RGB and the polarisation mosaic is still interleaved; (2) each RGB channel is then a monochrome polarisation mosaic, handled by polarization_demosaic. This is the decomposition Polanalyser documents for that sensor; *bayer* is the pattern of the half-resolution Bayer grid (RGGB for the IMX250MYR as read row-major from the top-left site) and *layout* the polariser angles inside a site.

Ground truth: twelve affine planes (4 angles x RGB) mosaicked and split come back to 1e-12 away from the border (bilinear is exact on affine fields, and the composition of two exact steps is exact).

Raises ValueError: *raw* is not 2-D, has a height or width that is not a multiple of 4, is non-finite, or *layout* / *bayer* is invalid.

पूरी 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 करते हैं)

• polarization_camera_pipeline — py -3.11 examples/polarization_camera_pipeline.py

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

—

इसी category के (polarization)

jones_element · jones_apply · stokes_from_jones · mueller_element · mueller_apply · stokes_analyze · polarization_demosaic · mueller_from_intensities


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

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