5.12. Binäärikynnystys¶
Monet kuvankäsittelyputket tiivistyvät jokaista pikseliä koskevaan kysymykseen: onko tämä kirkkaus sillä alueella, joka tarkoittaa ”etualaa”? Onko tämä väri riittävän lähellä punaista ollakseen sovelluksen seuraama merkki? Onko tämä pikseli osa ehdokasjoukkoa, jota putken seuraavan vaiheen tulisi tarkastella? Kynnystys on operaatio, joka muuttaa nämä kysymykset binääriseksi vastaukseksi jokaisessa kohdassa – päällä, jos pikseli vastaa, pois, jos ei – ja supistaa koko kuvan maskiksi, jota vasten loppuosa putkesta voi toimia.
5.12.1. Binäärimenetelmä¶
Metodi binary() ajaa tämän luokittelun jokaisen pikselin yli yhdellä kutsulla. Se ottaa listan kynnysarvoalueita – ehdot, joita pikseli voi vastata laskeakseen ”päälle” – ja kirjoittaa kuvan uudelleen niin, että jokainen pikseli, joka vastasi vähintään yhtä alueista, asetetaan formaatin maksimiarvoon ja jokainen, joka ei vastannut, asetetaan nollaan. Tuloksena on binäärimaski, jota loppuosa putkesta voi käyttää suoraan.
Yksinkertaisimmassa muodossa kynnysarvolistalla on yksi alue ja kutsu palauttaa maskin kyseisen alueen pikseleistä:
img.binary([(120, 255)])
Listamuoto tekee binary-metodista tehokkaan. Putki, joka haluaa seurata kahta värillistä merkkiä tai kirkkausaluetta sekä erillistä kylläisyyshuippua, välittää molemmat alueet samassa listassa ja saa yhden tulostemaskin, joka kattaa kaikki osumat.
Kynnystys muuttaa jatkuva-arvoisen kuvan binäärimaskiksi: jokaisesta kynnysarvoalueen sisällä olevasta pikselistä tulee formaatin maksimi, jokaisesta ulkopuolella olevasta tulee nolla.¶
5.12.2. Harmaasävytuple¶
Harmaasävykuvassa jokainen kynnysarvolistan alkio on kaksialkioinen tuple (lo, hi), joka kuvaa inklusiivista kirkkausaluetta. Pikselit, joiden arvot ovat lo:n ja hi:n välillä (mukaan lukien rajat), vastaavat; kaikki tuon alueen ulkopuolella ei vastaa. Luontevat kaavat ovat suoraviivaisia:
(0, 60)vastaa tummia pikseleitä – kaikkea mustasta syvään harmaaseen.(180, 255)vastaa kirkkaita pikseleitä – kaikkea vaaleanharmaasta valkoiseen.(100, 160)vastaa keskiharmaita pikseleitä – kaistaa kirkkausalueen keskellä.
Tuplen kahden arvon järjestyksellä ei ole merkitystä; metodi vaihtaa ne keskenään sisäisesti, jos lo on suurempi kuin hi, joten (60, 0) toimii samalla tavalla kuin (0, 60).
5.12.3. LAB-tuple värille¶
RGB565-kuvassa jokainen alkio on kuusialkioinen tuple (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi), joka kuvaa inklusiivista aluetta LAB-väriavaruudessa eikä suoraan punaisessa, vihreässä ja sinisessä. Kynnysarvot ovat L (vaaleus), A (vihreä-punainen-väriakseli) ja B (sininen-keltainen-väriakseli), joista kutakin verrataan pikselin arvoon kyseisessä kanavassa.
Syy kulkea LAB:n kautta sen sijaan, että kynnystettäisiin RGB suoraan, on ominaisuus, jonka ympärille LAB-väriavaruus suunniteltiin: LAB erottaa vaaleuden kromasta. Kaksi pikseliä, jotka näyttävät saman värin mutta eri kirkkauksilla, päätyvät eri L-arvoihin mutta suunnilleen samoihin A- ja B-arvoihin. Tämä erottelu antaa kynnysarvoalueiden kuvata väriä sen sijainnilla A- ja B-akseleilla ja jättää L-alueen levälleen, jotta se hyväksyy kyseisen värin kaikilla kirkkauksilla varjosta korostukseen. RGB-pohjainen kynnys ei pysty tähän – mikä tahansa muutos valaistuksessa siirtää kaikkia kolmea R-, G-, B-arvoa yhtä aikaa, ja RGB-kynnyksille rakennettu seuranta hajoaa heti ensimmäisellä kerralla, kun pilvi ohittaa auringon.
Käytännön kaava: valitse A- ja B-alueet, jotka kuvaavat sovelluksen seuraamaa väriä, ja jätä L-alue leveäksi – usein (0, 100) hyväksyäkseen minkä tahansa kirkkauden – ellei sovellus nimenomaisesti halua kynnystää sekä kirkkautta että väriä.
Tupleissa, joissa on vähemmän kuin kuusi arvoa, puuttuvat komponentit oletusarvona ovat maksimialue (ei rajoitusta kyseisellä akselilla). Kaksialkioinen (l_lo, l_hi) tuple RGB565-kynnysarvolistassa kynnystää siis vain vaaleuden ja vastaa jokaista väriä.
Muista
Aidosti levälleen jätetyllä L-alueella on sudenkuoppa alapäässä. Kun vaaleus laskee kohti nollaa, jokainen väri lähenee mustaa, jolloin A- ja B-arvot romahtavat kohti nollaa ja kohina alkaa hallita niitä – joten tummat pikselit voivat ajautua A- ja B-alueille ja tulla seuratuiksi kohdevärinä. Jos näkymän mustat alueet syttyvät osumiksi, nosta l_lo:ta, kunnes ne putoavat pois.
5.12.4. Liput¶
Kolme avainsana-argumenttia ohjaa tulostetta:
invert=Truekääntää tuloksen. Jokaisesta pikselistä, joka olisi vastannut, tulee nolla, ja jokaisesta, joka olisi ollut nolla, tulee maksimiarvo. Hyödyllinen, kun luonteva tapa kuvata etuala on sen perusteella, mitä se ei ole.zero=Truemuuttaa toimintatapaa: vastaavat pikselit nollataan ja vastaamattomat pikselit säilyttävät alkuperäiset arvonsa. Käytä tätä, kun tavoite on poistaa vastaavat pikselit kuvasta sen sijaan, että supistettaisiin kuva niiden binäärimaskiksi.to_bitmap=Truepalauttaa tuloksenBINARY-kuvana sen sijaan, että ylikirjoittaisi lähteen olemassa olevan formaatin. Yksi bitti per pikseli -tulos on se, mitä myöhemmät maskiargumentit hyväksyvät suoraan, ja muunnos säästää usein täyden formaatin maskin mukana kantamisen muistipaineen.
Maski ja ROI noudattavat samaa käytäntöä kuin muu pinta: roi-suorakulmio rajaa operaation osa-alueeseen, mask-kuva rajaa sen mielivaltaiseen kohtien kuvioon.
5.12.5. Oletuksena paikan päällä¶
Aritmeettisten operaatioiden tavoin binary toimii oletuksena paikan päällä: lähdekuvan pikselit ylikirjoitetaan binääritulosteella, ja alkuperäiset arvot ovat kutsun jälkeen poissa. Muoto to_bitmap=True on vaihtoehto, kun lähde täytyy säilyttää ja tulosteen tulisi olla vasta varattu BINARY-kuva. Myös muoto copy=True hyväksytään saman formaatin tulokselle uudessa puskurissa.