fullseye

polarization_demosaic — OPTICS polarization op

使い方

Split a polarisation-sensor mosaic into the four analyser images.

A polarisation camera puts four micro-polarisers on each 2x2 block of pixels; the raw frame is one (H, W) array in which neighbouring pixels saw the scene through different analysers. This returns a (4, H, W) array of images [I_0, I_45, I_90, I_135] (the polsweep sort, in :data:POLARIZATION_SWEEP_ANGLES order, so the result feeds :func:specularity.polarization_stokes and polarization_dolp_map directly), each interpolated to full resolution.

Interpolation is bilinear, the same estimate a Bayer demosaic makes for a colour plane that occupies one pixel in four: a missing pixel is the mean of its measured 4-neighbours (edge-adjacent) or 4-neighbours (diagonal), which is exactly the [[1, 2, 1], [2, 4, 2], [1, 2, 1]] / 4 kernel applied to the masked plane. Ground truth: on a plane that is linear in x and y the interpolation is exact (a bilinear estimate of an affine field is the field), so the test plants four affine fields, mosaics them, and demands every returned image equal its field to 1e-12 away from the border. The border is handled by mirroring the mosaic two pixels outward before interpolating (an even, non-duplicating reflection keeps the 2x2 phase), so a uniform field is exact up to the edge and a gradient is mirrored there — a symmetric bias on the outermost row and column, and said so. Against Polanalyser’s OpenCV bilinear path the interior agrees to the 16-bit quantisation (1.8e-5) and only the outer two pixels differ (2026-09-18).

layout is the angle at each 2x2 position, ((a00, a01), (a10, a11)) in degrees; the default is the Sony IMX250MZR block. Every angle in :data:POLARIZATION_SWEEP_ANGLES must appear exactly once.

Raises ValueError: raw is not a 2-D array, has an odd height or width (the block would be cut), contains non-finite values, or layout is not a permutation of the four sweep angles.

Provenance: the layout convention and the “four Bayer planes” reading of the mosaic follow Polanalyser (Maeda, MIT); the interpolation is the classic bilinear Bayer demosaic. This is a re-implementation from that description, not copied code, and it does not depend on OpenCV. Colour polarisation sensors (IMX250MYR, a 4x4 block) are handled by :func:polarization_demosaic_color.

ファミリ共通の入力契約(fail-closed)

optics の全 op は入力を検証してから計算する(黙って通さない):

詳しい使い方ガイド

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(polsweep を入力に取れる)

sfp_normals

同カテゴリ(polarization)

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


Provenance: optics.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。

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