5.10. Operații pe biți

Operațiile aritmetice de pe pagina anterioară lucrează pe valorile pixelilor – luminozitățile întregi sau cuvintele de culoare împachetate. Operațiile pe biți lucrează cu un nivel mai jos, pe biții individuali din interiorul acelor valori. Pentru imaginile binare, în care fiecare pixel este doar un bit, operațiile pe biți sunt aritmetica naturală.

5.10.1. Familia operațiilor pe biți

Clasa Image expune setul complet de operații pe biți cu două intrări:

Fiecare operează bit cu bit pe fiecare octet din tampoanele ambelor imagini. Pe o imagine binară, în care fiecare octet conține opt pixeli, operația rulează pe opt pixeli per octet procesat. Pe o imagine în tonuri de gri sau color, rulează pe fiecare bit al fiecărui canal.

Trei tabele de adevăr pentru operațiile AND, OR și XOR, una lângă alta. Fiecare tabel are patru rânduri pentru combinațiile de intrare 0-0, 0-1, 1-0, 1-1 și coloane etichetate A, B și rezultat. Sub tabelele de adevăr, două imagini binare mici A și B sunt desenate ca grile de celule negre și albe, cu rezultatul aplicării AND asupra lor arătat la dreapta sub forma unei grile care păstrează doar celulele care au fost albe în ambele.

Sus: tabelele de adevăr AND, OR și XOR – semantica la nivel de bit a fiecărei operații. Jos: două imagini binare A și B și rezultatul lui A.b_and(B), unde rezultatul păstrează doar pozițiile care au fost active în ambele intrări.

5.10.2. Combinarea măștilor

Cea mai frecventă utilizare a acestor operații este combinarea măștilor. O mască este o imagine binară care indică, poziție cu poziție, dacă o anumită condiție este îndeplinită. Două măști care descriu condiții diferite se combină într-o singură mască ce descrie o condiție compusă, printr-una dintre operațiile pe biți:

b_and() produce o mască ale cărei poziții sunt active doar atunci când ambele măști de intrare au fost active la acea poziție – „și”-ul natural al două condiții. Combinarea unei măști de prim-plan cu ieșirea unei treceri de prag prin b_and restrânge potrivirile pragului la prim-plan.

b_or() produce o mască ale cărei poziții sunt active ori de câte ori oricare mască de intrare a fost activă – „sau”-ul natural. Aplicarea OR asupra a două ieșiri cu prag produce o singură mască ce acoperă orice s-a potrivit cu oricare dintre două intervale de culoare.

b_xor() produce o mască ale cărei poziții sunt active ori de câte ori exact una dintre măștile de intrare a fost activă. Utilă pentru detectarea pozițiilor în care două măști diferă – pozițiile în care ieșirea pragului s-a schimbat între două cadre, diferența simetrică dintre două măști de referință, acel gen de lucruri.

Variantele negate – b_nand(), b_nor(), b_xnor() – produc complementul omoloagelor lor nenegate. Sunt utile atunci când modul natural de a descrie o condiție este „niciuna dintre acestea” sau „nu ambele” – nu este frecvent, dar merită să știți că există, astfel încât negarea să nu trebuiască să fie compusă urmând un AND cu o operație invert() separată.

5.10.3. Operațiile pe biți pe imagini nebinare

Operațiile pe biți rulează și pe imagini în tonuri de gri și color. Sunt cele mai utile acolo atunci când imaginea conține conținut de tip binar – un cadru în tonuri de gri ai cărui pixeli sunt toți 0 sau 255, un cadru RGB565 cu doar pixeli complet negri și complet albi – unde AND, OR și XOR dau aceleași combinații pe care le-ar da pe o imagine binară reală. Pentru imaginile care acoperă întregul interval de valori, operațiile aritmetice de pe pagina anterioară sunt de obicei o alegere mai potrivită.