5.12. Bináris küszöbölés

Sok képfeldolgozási folyamat végül egyetlen kérdésre redukálódik minden egyes képpontnál: vajon ez a fényerő abban a tartományban van, ami az „előtér”-t jelenti? Vajon ez a szín elég közel van a piroshoz ahhoz, hogy az alkalmazás által követett jelölő legyen? Vajon ez a képpont része annak a jelölthalmaznak, amelyet a folyamat következő lépésének meg kell vizsgálnia? A küszöbölés az a művelet, amely ezeket a kérdéseket minden pozíción bináris válasszá alakítja – be, ha a képpont megfelel, ki, ha nem –, és az egész képet egy maszkká redukálja, amellyel a folyamat többi része dolgozhat.

5.12.1. A binary metódus

A binary() metódus ezt az osztályozást egyetlen hívásban futtatja le minden képponton. Egy listát vesz át küszöbtartományokból – azokból a feltételekből, amelyeknek egy képpont megfelelhet, hogy „be”-nek számítson –, és átírja a képet úgy, hogy minden képpont, amely a tartományok legalább egyikének megfelelt, a formátum maximális értékére áll be, minden olyan pedig, amely nem felelt meg, nullára. Az eredmény az a bináris maszk, amelyet a folyamat többi része közvetlenül felhasználhat.

A legegyszerűbb formában a küszöblista egyetlen tartományt tartalmaz, és a hívás az adott tartományba eső képpontok maszkját adja vissza:

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

A lista forma az, ami a binary metódust erőteljessé teszi. Egy olyan folyamat, amely két színes jelölőt szeretne követni, vagy egy fényerő-tartományt plusz egy elszigetelt telítettségi csúcsot, mindkét tartományt ugyanabban a listában adja át, és egyetlen kimeneti maszkot kap, amely lefedi az összes találatot.

Felül egy vízszintes szürkeárnyalatos gradiens, "bemenet -- képpontértékek 0-tól 255-ig" felirattal. Alatta egy inkluzív küszöbtartomány lo-tól hi-ig, szögletes zárójelekkel megjelölve a gradiens mentén, körülzárva a találatnak számító fényerőértékek tartományát. Alul egy bináris kimeneti sáv fehéret mutat a lo-tól hi-ig terjedő tartományon belül, és feketét rajta kívül.

A küszöbölés egy folytonos értékű képet bináris maszkká alakít: a küszöbtartományon belüli minden képpont a formátum maximumává válik, a tartományon kívüli minden képpont pedig nullává.

5.12.2. A szürkeárnyalatos tuple

Szürkeárnyalatos kép esetén a küszöblista minden eleme egy kételemű (lo, hi) tuple, amely egy inkluzív fényerő-tartományt ír le. A lo és hi közötti (mindkettőt beleértve) értékű képpontok felelnek meg; minden, ami ezen a tartományon kívül esik, nem. A természetes minták egyszerűek:

  • A (0, 60) a sötét képpontoknak felel meg – mindennek a feketétől a mély szürkéig.

  • A (180, 255) a világos képpontoknak felel meg – mindennek a világosszürkétől a fehérig.

  • A (100, 160) a közepesen szürke képpontoknak felel meg – a fényerő-tartomány közepén lévő sávnak.

A két érték sorrendje a tuple-ön belül nem számít; a metódus belsőleg felcseréli őket, ha a lo nagyobb, mint a hi, így a (60, 0) ugyanúgy működik, mint a (0, 60).

5.12.3. A LAB tuple a színhez

RGB565 kép esetén minden bejegyzés egy hatelemű (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) tuple, amely egy inkluzív tartományt ír le a LAB színtérben, nem pedig közvetlenül a pirosban, zöldben és kékben. A küszöbök az L (világosság), az A (zöld-piros kromatikus tengely) és a B (kék-sárga kromatikus tengely), mindegyiket a képpont adott csatornában lévő értékéhez hasonlítva.

A LAB-on keresztüli haladás oka – ahelyett, hogy közvetlenül az RGB-t küszöbölnénk – az a tulajdonság, amely köré a LAB színteret tervezték: a LAB elválasztja a világosságot a krómától. Két képpont, amely ugyanazt a színt mutatja, de eltérő fényerővel, eltérő L értékeknél, de nagyjából azonos A és B értékeknél köt ki. Ez az elválasztás lehetővé teszi, hogy a küszöbtartományok egy színt az A és B tengelyen elfoglalt pozíciójával írjanak le, és az L tartományt tágra hagyják, hogy az adott színt minden fényerőn elfogadják, az árnyéktól a csúcsfényig. Egy RGB-alapú küszöb ezt nem tudja megtenni – a megvilágítás bármilyen változása egyszerre mozdítja el mind az R, G, B három értéket, és egy RGB-küszöbökre épülő követő összeomlik az első alkalommal, amikor egy felhő elhalad a nap előtt.

A gyakorlati minta: válaszd ki azokat az A és B tartományokat, amelyek leírják az alkalmazás által követett színt, és hagyd tágra az L tartományt – gyakran (0, 100), hogy bármilyen fényerőt elfogadjon –, hacsak az alkalmazás kifejezetten nem szeretne a szín mellett a fényerőre is küszöbölni.

A hatnál kevesebb értéket tartalmazó tuple-ök esetén a hiányzó komponensek alapértelmezés szerint a maximális tartományra állnak (nincs megkötés az adott tengelyen). Egy kételemű (l_lo, l_hi) tuple egy RGB565 küszöblistában ezért csak a világosságra küszöböl, és minden színnek megfelel.

Megjegyzés

Egy valóban tágra nyitott L tartománynak van egy buktatója az alsó végén. Ahogy a világosság a nulla felé csökken, minden szín a fekete felé konvergál, az A és B értékek a nulla felé omlanak össze, és a zaj uralja őket – így a sötét képpontok bedrifelhetnek az A és B tartományokba, és a célszínként követhetők. Ha a jelenet fekete régiói találatként világítanak fel, emeld a l_lo értékét, amíg ki nem esnek.

5.12.4. Jelzők

Három kulcsszavas argumentum vezérli a kimenetet:

  • Az invert=True megfordítja az eredményt. Minden képpont, amely megfelelt volna, nullára áll, és minden képpont, amely nulla lett volna, a maximális értékre. Hasznos, amikor az előtér leírásának természetes módja az, hogy mi nem az.

  • A zero=True megváltoztatja a működési módot: a megfelelő képpontok nullára állnak, a nem megfelelő képpontok pedig megtartják eredeti értéküket. Ezt akkor használd, amikor a cél az, hogy kitöröld a megfelelő képpontokat a képből, ahelyett hogy a képet ezek bináris maszkjává redukálnád.

  • A to_bitmap=True az eredményt BINARY képként adja vissza, ahelyett hogy felülírná a forrás meglévő formátumát. Az egy-bit-per-képpont eredmény az, amit a későbbi maszk-argumentumok közvetlenül elfogadnak, és az átalakítás gyakran megtakarítja egy teljes formátumú maszk magával hurcolásának memórianyomását.

A maszk és a ROI ugyanazt a konvenciót követi, mint a felület többi része: egy roi téglalap a műveletet egy alterületre szűkíti, egy mask kép pedig pozíciók tetszőleges mintázatára.

5.12.5. Alapértelmezés szerint helyben

Az aritmetikai műveletekhez hasonlóan a binary is alapértelmezés szerint helyben fut: a forráskép képpontjait felülírja a bináris kimenet, és az eredeti értékek a hívás után eltűnnek. A to_bitmap=True forma az alternatíva, amikor a forrást meg kell őrizni, és a kimenetnek egy frissen lefoglalt BINARY képnek kell lennie. A copy=True forma is elfogadott egy azonos formátumú eredményhez egy új pufferen.