polarization opなし → matrix(引数だけで決まる op —— 画像やデータの入力を取らない)import fullseye as fs; fs.ledger.mueller_element(kind='polarizer', angle_deg=0.0, retardance_deg=90.0) (実装を直接呼ぶなら import optics; optics.mueller_element(kind='polarizer', angle_deg=0.0, retardance_deg=90.0)、台帳から引くなら opsoptics.get("mueller_element"))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.
optics の全 op は入力を検証してから計算する(黙って通さない):
_mm / _um / _deg / _mrad。mm と µm の取り違えは crash ではなく「もっともらしく間違った答え」なので、名前で防ぐ。大きさから単位を推測する処理は一切しない。ValueError — float('50') は成功してしまうため、未パースの設定値が長さとして通り抜ける(実測: thin_lens('50', '200') がもっともらしい 66.667 mm を返していた)。bool も True == 1 の暗黙昇格として拒否。ValueError(実数枠のみ。虚部の無言切り捨て・マスク剥がしを拒否)。NaN/Inf は全入力で ValueError。depth_of_field の過焦点距離以遠の far_mm = inf(それが過焦点距離の定義)と gaussian_beam のウエストでの wavefront_radius_mm = inf(平面波面の曲率半径)。どちらも有限の相棒(far_is_infinite / curvature_per_mm)を併せて返す。それ以外の無言 NaN/Inf は内部で検出して ValueError —「float64 が溢れた」と「答えが無限大」は別の主張なので、後者の顔で前者を返さない。optics.MAX_GRID(4096)、供給された場/PSF/開口は optics.MAX_FIELD_ELEMENTS(2^24)、ABCD 素子列は optics.MAX_SYSTEM_ELEMENTS(1024)、Zernike は MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25)。小さな引数から巨大な内部確保が起きる経路(実測: n_max=40 × 4096² で 108 GB)を fail-closed で塞ぐ。| 物理的に不可能な状態も拒否: 偏光度 > 1 の Stokes ベクトル、負の透過率、負の強度、n- | m | が奇数などの不正な Zernike 添字。 |
py -3.11 examples/optics_imaging.pypy -3.11 examples/poc_mueller_dofp_observability.pypy -3.11 examples/poc_photoelasticity.pypy -3.11 examples/polarization_camera_pipeline.pymatrix を入力に取れる)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.