5.12. Binární prahování#

Spousta řetězců zpracování obrazu se scvrkává na otázku ohledně každého pixelu: leží tento jas uvnitř rozsahu, který znamená „popředí“? Je tato barva dostatečně blízko červené, aby šlo o značku, kterou aplikace sleduje? Je tento pixel součástí množiny kandidátů, na kterou se má podívat další krok řetězce? Prahování je operace, která tyto otázky převádí na binární odpověď na každé pozici – zapnuto, pokud pixel odpovídá, vypnuto, pokud ne – a celý obraz redukuje na masku, se kterou může zbytek řetězce pracovat.

5.12.1. Metoda binary#

Metoda binary() provede tuto klasifikaci napříč každým pixelem jediným voláním. Bere seznam prahových rozsahů – podmínek, které může pixel splnit, aby se počítal jako „zapnutý“ – a přepíše obraz tak, že každý pixel, který odpovídal alespoň jednomu z rozsahů, je nastaven na maximální hodnotu daného formátu, a každý pixel, který neodpovídal, je nastaven na nulu. Výsledkem je binární maska, kterou může zbytek řetězce přímo použít.

V nejjednodušší podobě má seznam prahů jeden rozsah a volání vrací masku pixelů v tomto rozsahu:

img.binary([(120, 255)])

Seznamová podoba je to, co dělá binary mocným. Řetězec, který chce sledovat dvě barevné značky nebo jasový rozsah plus izolovanou špičku saturace, předá oba rozsahy v témže seznamu a získá jedinou výstupní masku pokrývající všechny shody.

A horizontal grayscale gradient at the top labelled "input -- pixel values from 0 to 255". Below it, an inclusive threshold range from lo to hi is marked with brackets along the gradient, enclosing the range of brightness values that count as matches. A binary output bar at the bottom shows white inside the lo-to-hi range and black outside it.

Prahování převádí obraz se spojitými hodnotami na binární masku: každý pixel uvnitř prahového rozsahu se stane maximem daného formátu, každý pixel mimo se stane nulou.#

5.12.2. N-tice pro stupně šedi#

U obrazu ve stupních šedi je každá položka v seznamu prahů dvouprvkovou n-ticí (lo, hi) popisující inkluzivní jasový rozsah. Pixely s hodnotami mezi lo a hi (včetně) odpovídají; vše mimo tento rozsah ne. Přirozené vzory jsou přímočaré:

  • (0, 60) odpovídá tmavým pixelům – vše od černé až po tmavě šedou.

  • (180, 255) odpovídá jasným pixelům – vše od světle šedé až po bílou.

  • (100, 160) odpovídá středně šedým pixelům – pásmu uprostřed jasového rozsahu.

Na pořadí obou hodnot uvnitř n-tice nezáleží; metoda je interně prohodí, pokud je lo větší než hi, takže (60, 0) funguje stejně jako (0, 60).

5.12.3. N-tice LAB pro barvu#

U obrazu RGB565 je každá položka šestiprvkovou n-ticí (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) popisující inkluzivní rozsah v barevném prostoru LAB spíše než přímo v červené, zelené a modré. Prahy jsou L (světlost), A (zeleno-červená chromatická osa) a B (modro-žlutá chromatická osa), každý porovnaný s hodnotou pixelu v daném kanálu.

Důvod, proč jít přes LAB místo prahování přímo RGB, je vlastnost, kolem které byl barevný prostor LAB navržen: LAB odděluje světlost od chroma. Dva pixely, které ukazují stejnou barvu, ale při různých jasech, skončí na různých hodnotách L, ale zhruba na stejných hodnotách A a B. Toto oddělení umožňuje prahovým rozsahům popsat barvu její polohou na osách A a B a ponechat rozsah L široce otevřený, aby tuto barvu přijal při každém jasu od stínu po světlo. Práh založený na RGB to nedokáže – jakákoli změna osvětlení posune všechny tři hodnoty R, G, B najednou a sledovač postavený na prazích RGB se zhroutí, jakmile poprvé před slunce přejde mrak.

Praktický vzor: zvolte rozsahy A a B, které popisují barvu, kterou aplikace sleduje, a ponechte rozsah L široký – často (0, 100) pro přijetí libovolného jasu – pokud aplikace výslovně nechce prahovat na jasu i barvě.

U n-tic s méně než šesti hodnotami se chybějící složky standardně nastaví na maximální rozsah (bez omezení na dané ose). Dvouprvková n-tice (l_lo, l_hi) v seznamu prahů RGB565 tedy prahuje pouze na světlosti a odpovídá každé barvě.

Poznámka

Skutečně široce otevřený rozsah L má na spodním konci háček. Jak světlost klesá k nule, každá barva konverguje k černé, přičemž hodnoty A a B se hroutí k nule a začnou být ovládány šumem – takže tmavé pixely se mohou zatoulat do rozsahů A a B a být sledovány jako cílová barva. Pokud se černé oblasti scény rozsvěcují jako shody, zvyšujte l_lo, dokud nevypadnou.

5.12.4. Příznaky#

Výstup řídí tři klíčové argumenty:

  • invert=True obrátí výsledek. Každý pixel, který by odpovídal, se stane nulou, a každý pixel, který by byl nulou, se stane maximální hodnotou. Užitečné, když je přirozeným způsobem popisu popředí to, čím není.

  • zero=True mění režim činnosti: odpovídající pixely se vynulují a neodpovídající pixely si ponechají své původní hodnoty. Použijte to, když je cílem odpovídající pixely z obrazu vymazat spíše než obraz redukovat na jejich binární masku.

  • to_bitmap=True vrací výsledek jako obraz BINARY místo přepsání stávajícího formátu zdroje. Výsledek s jedním bitem na pixel je to, co pozdější argumenty masky přijímají přímo, a převod často ušetří tlak na paměť plynoucí z nošení masky v plném formátu.

Maska a ROI se řídí stejnou konvencí jako zbytek tohoto rozhraní: obdélník roi omezí operaci na podoblast, obraz mask ji omezí na libovolný vzor pozic.

5.12.5. Na místě ve výchozím nastavení#

Stejně jako aritmetické operace běží binary ve výchozím nastavení na místě: pixely zdrojového obrazu jsou přepsány binárním výstupem a původní hodnoty jsou po volání pryč. Podoba to_bitmap=True je alternativou, když je potřeba zdroj zachovat a výstupem má být čerstvě alokovaný obraz BINARY. Pro výsledek ve stejném formátu v novém bufferu se přijímá i podoba copy=True.