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.

Vodorovný gradient ve stupních šedi nahoře označený "input -- pixel values from 0 to 255". Pod ním je inkluzivní prahový rozsah od lo do hi vyznačen závorkami podél gradientu, uzavírající rozsah jasových hodnot, které se počítají jako shody. Binární výstupní pruh dole zobrazuje bílou uvnitř rozsahu lo až hi a černou mimo něj.

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.