dichromatic op• 데이터 종류: rgbimage × labels → vector
• 호출: import specularity; specularity.illuminant_from_dichromatic_planes(image_rgb, labels, min_pixels=16, min_plane_ratio=1e-06, min_intersection_ratio=1e-06)(또는 opsspecular.get("illuminant_from_dichromatic_planes"))
둘 이상의 소재로부터 광원 색을 복원합니다. → 단위 3 벡터.
> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.
Lee's construction (1986). Under the dichromatic model every pixel of one
material lies in the plane spanned by that material's body colour and the
illuminant colour, so each material contributes a plane through the origin
of RGB, and all of those planes contain the illuminant direction. Two
materials with different body colours therefore intersect in exactly one
line, and that line is the answer — a null-space computation, closed form.
*labels* is an `(H, W)` integer map naming the material at each pixel;
negative labels are ignored (background). Each material needs *min_pixels*
pixels and genuine highlight variation: a material seen with no specular
reflection at all has colours along a single ray, which defines no plane.
That is measured by the second-to-first singular ratio of its colour matrix
and rejected below *min_plane_ratio* rather than contributing an arbitrary
normal.
The returned direction is unit length with a positive component sum
(illuminant colours are positive; the null space fixes the line, not the
sign). On synthetic data with three known materials it reproduces the true
illuminant with a maximum component error of 4.4e-14 and an angular error
that rounds to 0.0 degrees (measured in `tests/test_specularity.py`).
*min_intersection_ratio* guards the answer itself: if the plane normals are
nearly parallel — two materials whose body colours differ only in
brightness, which is the same material twice — the intersection is
ill-conditioned and the call raises instead of returning a direction picked
by rounding error.
Raises `ValueError`: shape or dtype problems as in
:func:specular_diffuse_split; *labels* is not an `(H, W)` integer map
matching the image; more than :data:MAX_MATERIALS distinct labels; fewer
than two materials survive the *min_pixels* and *min_plane_ratio* tests; the
surviving planes do not intersect in a well-determined line.
• specular_photometric 패밀리 가이드
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_white_balance — py -3.11 examples/poc_white_balance.py
• specular_photometric — py -3.11 examples/specular_photometric.py
vector 를 입력으로 받는 것)—
dichromatic)specular_diffuse_split · specular_coefficient_map · specular_free_transform
*Provenance: specularity.py — SPECULAR 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.