polarization op• 数据种类:polsweep → image2d
• 调用:import specularity; specularity.polarization_separate(images, angles_deg=(0.0, 45.0, 90.0, 135.0), max_violation_frac=0.0)(或 opsspecular.get("polarization_separate"))
把偏振片旋转序列分成非偏振与线偏振的辐亮度。→ (diffuse, specular),都是 (H, W)。
> 以下的详细说明为原文 —— 摘要与标题已翻译。
Fitting `I(t) = 0.5 (S0 + S1 cos 2t + S2 sin 2t)` per pixel gives
`I_min and I_max` in closed form, and the classical separation
(Wolff & Boult 1991; Nayar, Fang & Boult 1997) reads
`diffuse = 2 * I_min` (the unpolarised radiance)
`specular = I_max - I_min` (the linearly polarised radiance)
with `diffuse + specular = I_min + I_max` = the total scene radiance, so
nothing is lost or invented. Round-tripping
:func:polarization_render through this operator returns the inputs with a
maximum absolute error of 3.9e-16 for the four angles of a
division-of-focal-plane sensor and 4.4e-16 for a bare three-angle sweep
(measured in `tests/test_specularity.py`).
Read the names as shorthand. What is recovered exactly is the
unpolarised and polarised parts. Calling them diffuse and specular assumes
diffuse reflection is unpolarised and specular reflection is fully linearly
polarised — true near Brewster's angle for a dielectric, **false at normal
incidence**, where the specular reflection is unpolarised and this operator
returns all of it as "diffuse", and unreliable for metals. The polarisation
route is complementary to the colour route
(:func:specular_diffuse_split), not a replacement: it needs no illuminant
colour and works on textured, multi-material surfaces, but it needs a
favourable geometry.
*max_violation_frac* is the fraction of pixels allowed to fit a negative
minimum radiance before the call fails. The default 0 is fail-closed: a
negative fitted minimum means the modulation exceeded the mean, which no
analyser can produce, and it usually means the frames and *angles_deg* are
out of order. Raise it to clamp sensor-noise-level violations to zero as a
deliberate, recorded choice.
Raises `ValueError: *images* is not an (N, H, W)` stack of at
least 3 frames, or exceeds :data:MAX_LIGHTS / :data:MAX_STACK_ELEMENTS;
*angles_deg* does not match the frame count or leaves the fit
rank-deficient (two angles equal modulo 180); more than
*max_violation_frac* of the pixels fit a negative minimum.
• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。
• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。
• 算法的正典(作者・年份)与用途见上面的族使用指南。
• poc_polarization_specular — py -3.11 examples/poc_polarization_specular.py
• specular_photometric — py -3.11 examples/specular_photometric.py
image2d 作为输入)polarization)polarization_render · polarization_dolp_map · polarization_stokes
*Provenance: specularity.py — SPECULAR 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.