mueller_element — OPTICS polarization op

• 資料種類:無 → matrix(僅由參數決定的運算子 —— 不接受影像或資料輸入)

• 呼叫: 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"))

• GPU:無(僅 CPU 參考實作)

用法

單個偏振元件的 4x4 實 Mueller 矩陣。

> 以下的詳細說明為原文 —— 摘要與標題已翻譯。

*kind* is one of MUELLER_KINDS — the same five as 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 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 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 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 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 的每個運算子都先檢驗輸入再計算(不讓任何東西無聲通過):

• 單位寫進參數名 —— _mm / _um / _deg / _mrad。把 mm 和 µm 弄混不會當掉,而是給出「看似合理卻是錯的答案」,所以用命名來防。這裡絕不從數值大小去猜單位。

• 字串一律 ValueError —— float('50') 會成功,於是未解析的設定值會被當成長度混進來(實測:thin_lens('50', '200') 曾回傳看似合理的 66.667 mm)。bool 也按 True == 1 的隱式提升拒絕。

• complex / masked array 一律 ValueError(僅接受實數槽位;拒絕無聲丟棄虛部或剝掉遮罩)。所有輸入中的 NaN/Inf 一律 ValueError。

• 逐項點名拒絕除零及其近親:焦距 0、曲率半徑 0、折射率 <= 0、全不透明光闌(全為 0,正規化變成 0/0)、總和 <= 0 的 PSF、S0 = 0 的 Stokes 向量、物體位於前焦點(像在無窮遠)。

• 只有兩個運算子會回傳非有限值,而且都寫進了契約: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)。以 fail-closed 堵住「小參數引發巨大內部配置」的路徑(實測:n_max=40 × 4096² 需要 108 GB)。

• 物理上不可能的狀態同樣拒絕:偏振度 > 1 的 Stokes 向量、負穿透率、負強度、n-|m| 為奇數等非法 Zernike 指標。

詳細使用指南

• optics_imaging 族使用指南

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

• 演算法的正典(作者、年份)與用途見上面的族使用指南。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• optics_imaging — py -3.11 examples/optics_imaging.py

• poc_mueller_dofp_observability — py -3.11 examples/poc_mueller_dofp_observability.py

• poc_photoelasticity — py -3.11 examples/poc_photoelasticity.py

• polarization_camera_pipeline — py -3.11 examples/polarization_camera_pipeline.py

型別可銜接的下一個運算子(可接受 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 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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