fullseye

mueller_element — OPTICS polarization op

使い方

A 4x4 real Mueller matrix for one polarisation element.

kind is one of :data:MUELLER_KINDS — the same five as :func:jones_element plus "depolarizer" (ideal, diag(1, 0, 0, 0)), which has no Jones counterpart at all. That extra kind is the reason this family exists: Jones algebra can only carry fully polarised light, Mueller algebra carries partial polarisation, scattering and depolarisation — which is what a real polarisation camera sees.

Angles are doubled inside (c = cos(2a), s = sin(2a)) because the Stokes parameters live on the Poincare sphere, where a physical rotation by a is a rotation by 2a.

Returns a (4, 4) float64 matrix acting on [S0, S1, S2, S3]; apply it with :func:mueller_apply and compose a train as M_last @ ... @ M_first.

Ground truth it reproduces exactly: an ideal polariser transmits exactly half of unpolarised light ([1,0,0,0] -> S0 = 0.5) and fully polarises it; two polarisers at relative angle theta transmit 0.5*cos^2(theta) (Malus); a rotator by 45 degrees turns horizontal into 45-degree linear; the depolariser leaves S0 and kills S1..S3. Cross-checked against the Jones family in the tests — for every kind and a sweep of angles, the Jones path and the Mueller path return the same Stokes vector to 1e-14, which is the only construction that catches a sign slip in either one.

Raises ValueError: an unknown kind; non-finite angle_deg; or, for kind="retarder", non-finite retardance_deg.

Ideal, lossless (except the polariser’s physical loss), normal-incidence elements; no diattenuation-plus-retardance combinations, no depolarisation other than the ideal case. A polariser with a finite extinction ratio is :func:mueller_partial_polarizer.

Per-pixel fields (2026-10-23). An array angle_deg (or, for kind="retarder", an array retardance_deg) returns (*shape, 4, 4), one matrix per entry of the broadcast shape — an isoclinic angle map and a retardance map of a photoelastic part give the whole field in one call, ready for :func:mueller_apply’s field form. Before this the call raised ValueError and the photoelasticity PoC had to assemble (H, W, 4, 4) by hand. Scalars take the original code path untouched (scalar results are bit-for-bit what they were; pinned by a test against a verbatim copy of the old code). Output capped at :data:MAX_FIELD_ELEMENTS numbers.

Angle convention. angle_deg is measured from +x (along a row) toward +y (down the rows): clockwise on a displayed image — the sense of atan2(ny, nx) of a normal map and of 0.5 * atan2(2 txy, sxx - syy) for image-coordinate stresses. See the polarisation section comment of this module.

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

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

詳しい使い方ガイド

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

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

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

abcd_trace · emva_filter_distortion · mueller_apply · mueller_checks · equirect_rotate · pixel_shift_capture · pixel_shift_merge · pixel_shift_motion_mask

同カテゴリ(polarization)

jones_element · jones_apply · stokes_from_jones · mueller_partial_polarizer · mueller_apply · stokes_analyze · polarization_demosaic · polarization_demosaic_color


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

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