fullseye

jones_element — OPTICS polarization op

使い方

A 2x2 complex Jones matrix for one polarisation element.

kind is one of :data:JONES_KINDS:

"polarizer" ideal linear polariser, transmission axis at angle_deg from x · "retarder" linear retarder, fast axis at angle_deg, retardance retardance_deg · "quarter_wave" / "half_wave" retarders with the retardance fixed at 90 / 180 degrees (retardance_deg is then ignored — stated here so a caller who passes one is not left wondering) · "rotator" optical rotator turning the polarisation by angle_deg.

The retarder is written symmetrically, diag(exp(-i*d/2), exp(+i*d/2)) before rotation, so it introduces no common phase — the fast axis leads. (Cross-checked 2026-09-18: Jones phase and handedness conventions differ per library — pypolar carries two and this matches neither away from 0 degrees — so the comparison is made in the Mueller domain: every kind, pushed through :func:stokes_from_jones, equals pypolar’s Mueller element to 1e-15. The rotator turns the state by +angle, so pypolar op_rotation / polanalyser rotator — coordinate rotations — equal ours at -angle. See tests/test_polarization_external_diff.py.) Elements are built as R(+a) @ J0 @ R(-a).

Returns a (2, 2) complex128 matrix acting on a Jones vector [Ex, Ey]; compose a train with J_total = J_last @ ... @ J_first and apply it with :func:jones_apply.

Ground truth it reproduces exactly (machine precision): two crossed ideal polarisers multiply to the zero matrix; a polariser is idempotent (P @ P == P); a half-wave plate is an involution up to a global phase (H @ H == -I in this symmetric convention); a quarter-wave plate at 45 degrees turns horizontal linear light into circular (|S3| == 1); the Malus law cos^2(theta) falls out of two polarisers at relative angle theta.

Raises ValueError: an unknown kind (the message lists the valid ones); non-finite angle_deg or retardance_deg.

Ideal, lossless, normal-incidence elements. A real polariser has a finite extinction ratio and a real waveplate is chromatic; the waveplate’s chromatism is not modelled and not silently approximated, and the finite extinction ratio exists only in the Mueller family (:func:mueller_partial_polarizer). Jones algebra can only carry fully polarised light — for partial polarisation use :func:mueller_element.

Per-pixel fields (2026-10-23). An array angle_deg (or, for kind="retarder", an array retardance_deg) builds one element per entry: the result is (*shape, 2, 2) where shape is the broadcast of the array arguments — a fast-axis or retardance map of a photoelastic part, one matrix per pixel. Scalars take the original code path untouched, so a scalar call returns exactly what it always did. The output is 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. See the comment at the top of the polarisation section of this module for how that was established and what a counter-clockwise sensor must do.

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

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

詳しい使い方ガイド

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

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

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

angular_spectrum_propagate · four_f_filter · jones_apply

同カテゴリ(polarization)

jones_apply · stokes_from_jones · mueller_element · 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.