5.10. Bitovne operacije¶
Aritmetičke operacije na prethodnoj stranici rade na vrijednostima piksela – cjelobrojnim svjetlinama ili pakiranim riječima boje. Bitovne operacije rade na jednoj razini niže, na pojedinačnim bitovima unutar tih vrijednosti. Za binarne slike, gdje je svaki piksel samo jedan bit, bitovne operacije prirodna su aritmetika.
5.10.1. Bitovna obitelj¶
Klasa Image izlaže potpuni skup bitovnih operacija s dva ulaza:
b_and()– bitovni AND.b_or()– bitovni OR.b_xor()– bitovni isključivi OR.b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
Svaka operira bit po bit na svakom bajtu međuspremnika obiju slika. Na binarnoj slici, gdje svaki bajt sadrži osam piksela, operacija se izvršava na osam piksela po obrađenom bajtu. Na slici u sivim tonovima ili u boji izvršava se na svakom bitu svakog kanala.
Gore: tablice istinitosti za AND, OR i XOR – bitovna semantika svake operacije. Dolje: dvije binarne slike A i B te rezultat A.b_and(B), gdje rezultat zadržava samo položaje koji su bili uključeni u oba ulaza.¶
5.10.2. Kombiniranje maski¶
Najčešća pojedinačna upotreba ovih operacija jest kombiniranje maski. Maska je binarna slika koja kaže, položaj po položaj, je li neki uvjet ispunjen. Dvije maske koje opisuju različite uvjete kombiniraju se u jednu masku koja opisuje složeni uvjet pomoću jedne od bitovnih operacija:
b_and() proizvodi masku čiji su položaji uključeni samo kada su obje ulazne maske bile uključene na tom položaju – prirodno „i” dvaju uvjeta. Kombiniranje maske prednjeg plana s izlazom prolaza pragiranja pomoću b_and ograničava podudaranja praga na prednji plan.
b_or() proizvodi masku čiji su položaji uključeni kad god je bilo koja ulazna maska bila uključena – prirodno „ili”. ORiranje dvaju pragiranih izlaza zajedno proizvodi jednu masku koja pokriva sve što se podudaralo s bilo kojim od dvaju raspona boja.
b_xor() proizvodi masku čiji su položaji uključeni kad god je točno jedna ulazna maska bila uključena. Korisno za otkrivanje položaja na kojima se dvije maske ne slažu – položaja na kojima se izlaz praga promijenio između dviju sličica, simetrične razlike između dviju referentnih maski, te vrste stvari.
Negirane inačice – b_nand(), b_nor(), b_xnor() – proizvode komplement svojih nenegiranih parnjaka. Korisne su kada je prirodan način opisivanja uvjeta „nijedno od ovoga” ili „ne oboje” – nije uobičajeno, ali vrijedi znati da postoje kako negaciju ne bi trebalo slagati nadovezivanjem AND-a sa zasebnim invert().
5.10.3. Bitovne operacije na nebinarnim slikama¶
Bitovne operacije također se izvršavaju na slikama u sivim tonovima i u boji. Tamo su najkorisnije kada slika sadrži binarni sadržaj – sličica u sivim tonovima čiji su pikseli svi 0 ili 255, RGB565 sličica samo s potpuno crnim i potpuno bijelim pikselima – gdje AND, OR i XOR daju iste kombinacije koje bi dali na istinskoj binarnoj slici. Za slike koje obuhvaćaju puni raspon vrijednosti, aritmetičke operacije s prethodne stranice obično su bolji izbor.