fullseye

sfp_disambiguate — OPTICS shape_from_polarization op

使い方

Pick one normal per pixel from the candidate set of :func:sfp_normals, using a stated prior — convexity with Brewster-ridge segmentation, or a coarse depth / normal map.

prior="convex" (an object bulging toward the camera, such as a dome, a lens or a cap): the azimuth is the candidate pointing away from center (default: the centroid of mask). For the specular model the two zenith branches are separated by the Brewster ridge — the pixels whose DoLP is within brewster_tol of 1: the connected region of the mask that contains center (minus the ridge) takes the branch below Brewster’s angle, the rest of the mask the branch above. Inside the ridge band the branch is read from the radial slope of the DoLP (a convex surface tilts more toward its rim, so the DoLP rises outward below Brewster’s angle and falls outward above it). If the object never reaches Brewster’s angle there is no ridge and every pixel stays on the low branch, which is right for a shallow dome. If noise breaks the ridge, the outside leaks in and takes the low branch — measured in the tests, not hidden.

prior="normals" / prior="depth": per pixel, the candidate closest in angle to prior_normals (H, W, 3) — or to the normals of coarse_depth (H, W) (height toward the camera, pixel units, :func:photometric.surface_normals). This resolves both ambiguities at once, and a coarse depth needs to be right only to within the angular distance between candidates.

Pixels outside mask (default candidates["valid"]) are set to (0, 0, 1) (flat background, the convention of :func:photometric.integrate_normals). Invalid pixels inside the mask (valid is False: dark, physically impossible, or out of the model’s reach): invalid="raise" refuses (fail-closed), "exclude" drops them to the background.

Returns an (H, W, 3) float64 unit normal map (the normalmap sort).

Raises ValueError: candidates not an :func:sfp_normals result; unknown prior / invalid; a prior’s array missing or of the wrong shape; an empty mask; invalid pixels inside the mask with invalid="raise".

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

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

詳しい使い方ガイド

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

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

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

grating_rgb · thin_film_rgb · ward_anisotropic · micro_normals · blast_normals · finish_shade · oren_nayar · clearcoat_shade

同カテゴリ(shape_from_polarization)

sfp_dolp_model · dolp_to_zenith · aolp_to_azimuth · sfp_render · sfp_normals · sfp_estimate_index · sfp_height


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

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