5.10. Bittioperaatiot¶
Edellisen sivun aritmeettiset operaatiot toimivat pikselien arvoilla – kokonaislukukirkkauksilla tai pakatuilla värisanoilla. Bittioperaatiot toimivat tasoa alempana, noiden arvojen sisällä olevilla yksittäisillä biteillä. Binäärikuville, joissa kukin pikseli on vain yksi bitti, bittioperaatiot ovat luonnollinen aritmetiikka.
5.10.1. Bittioperaatioiden perhe¶
Image-luokka tarjoaa täyden joukon kaksisyötteisiä bittioperaatioita:
b_and()– bittikohtainen AND.b_or()– bittikohtainen OR.b_xor()– bittikohtainen poissulkeva OR.b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
Kukin toimii bittikohtaisesti molempien kuvien puskureiden jokaiselle tavulle. Binäärikuvassa, jossa kukin tavu sisältää kahdeksan pikseliä, operaatio suoritetaan kahdeksalle pikselille käsiteltyä tavua kohden. Harmaasävy- tai värikuvassa se suoritetaan jokaisen kanavan jokaiselle bitille.
Ylhäällä: AND-, OR- ja XOR-totuustaulut – kunkin operaation bittitason semantiikka. Alhaalla: kaksi binäärikuvaa A ja B sekä operaation A.b_and(B) tulos, jossa tulos säilyttää vain ne paikat, jotka olivat päällä molemmissa syötteissä.¶
5.10.2. Maskien yhdistäminen¶
Näiden operaatioiden ylivoimaisesti yleisin käyttö on maskien yhdistäminen. Maski on binäärikuva, joka kertoo paikka paikalta, täyttyykö jokin ehto. Kaksi eri ehtoja kuvaavaa maskia yhdistyvät yhdeksi yhdistettyä ehtoa kuvaavaksi maskiksi jonkin bittioperaation kautta:
b_and() tuottaa maskin, jonka paikat ovat päällä vain silloin, kun molemmat syötemaskit olivat päällä kyseisessä paikassa – kahden ehdon luonnollinen ”ja”. Etualan maskin yhdistäminen kynnystysvaiheen ulostuloon b_and-operaation kautta rajoittaa kynnysarvon täsmäykset etualaan.
b_or() tuottaa maskin, jonka paikat ovat päällä aina kun kumpi tahansa syötemaski oli päällä – luonnollinen ”tai”. Kahden kynnystetyn ulostulon OR-yhdistäminen tuottaa yhden maskin, joka kattaa kaiken, mikä täsmäsi kumpaan tahansa kahdesta värialueesta.
b_xor() tuottaa maskin, jonka paikat ovat päällä aina kun täsmälleen yksi syötemaski oli päällä. Hyödyllinen paikkojen tunnistamiseen, joissa kaksi maskia eroavat toisistaan – paikat, joissa kynnystyksen ulostulo muuttui kahden kehyksen välillä, kahden vertailumaskin symmetrinen erotus, tämänkaltaiset asiat.
Negatoidut muunnelmat – b_nand(), b_nor(), b_xnor() – tuottavat negatoimattomien vastineidensa komplementin. Ne ovat hyödyllisiä, kun luonnollinen tapa kuvata ehto on ”ei kumpikaan näistä” tai ”ei molemmat” – ei yleistä, mutta hyvä tietää olemassaoleviksi, jotta negaatiota ei tarvitse koota seuraamalla AND-operaatiota erillisellä invert()-operaatiolla.
5.10.3. Bittioperaatiot ei-binäärisillä kuvilla¶
Bittioperaatiot suoritetaan myös harmaasävy- ja värikuvilla. Ne ovat siellä hyödyllisimpiä, kun kuva sisältää binäärimäistä sisältöä – harmaasävykehys, jonka pikselit ovat kaikki 0 tai 255, RGB565-kehys, jossa on vain täysin mustia ja täysin valkoisia pikseleitä – jossa AND, OR ja XOR antavat samat yhdistelmät kuin ne antaisivat aidolla binäärikuvalla. Kuville, jotka kattavat koko arvojen alueen, edellisen sivun aritmeettiset operaatiot sopivat yleensä paremmin.