illuminant_from_dichromatic_planes — SPECULAR dichromatic op

Datenarten: rgbimage × labelsvector

Aufruf: import specularity; specularity.illuminant_from_dichromatic_planes(image_rgb, labels, min_pixels=16, min_plane_ratio=1e-06, min_intersection_ratio=1e-06) (oder opsspecular.get("illuminant_from_dichromatic_planes"))

Verwendung

Gewinnt die Beleuchtungsfarbe aus zwei oder mehr Materialien zurück. → Einheits-3-Vektor.

> Die ausführliche Beschreibung unten ist der Originaltext — Zusammenfassung und Überschriften sind übersetzt.

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.

Ausführlicher Anwendungsleitfaden

Leitfaden zur Familie specular_photometric

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

poc_white_balancepy -3.11 examples/poc_white_balance.py

specular_photometricpy -3.11 examples/specular_photometric.py

Typkompatible Folge-Operatoren (nehmen vector als Eingabe)

Gleiche Kategorie (dichromatic)

specular_diffuse_split · specular_coefficient_map · specular_free_transform


*Provenance: specularity.py — SPECULAR Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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