5.10. Operazioni bitwise

Le operazioni aritmetiche della pagina precedente lavorano sui valori dei pixel – le luminosità intere o le parole di colore impacchettate. Le operazioni bitwise lavorano a un livello più basso, sui singoli bit all’interno di quei valori. Per le immagini binarie, dove ogni pixel è un solo bit, le operazioni bitwise sono l’aritmetica naturale.

5.10.1. La famiglia bitwise

La classe Image espone l’insieme completo delle operazioni bitwise a due input:

Ciascuna opera bit per bit su ogni byte dei buffer di entrambe le immagini. Su un’immagine binaria, dove ogni byte contiene otto pixel, l’operazione viene eseguita su otto pixel per byte elaborato. Su un’immagine in scala di grigi o a colori viene eseguita su ogni bit di ogni canale.

Tre tabelle di verità per le operazioni AND, OR e XOR affiancate. Ogni tabella ha quattro righe per le combinazioni di input 0-0, 0-1, 1-0, 1-1 e colonne etichettate A, B e risultato. Sotto le tabelle di verità, due piccole immagini binarie A e B sono disegnate come griglie di celle nere e bianche, con il risultato del loro AND mostrato a destra come una griglia che mantiene solo le celle che erano bianche in entrambe.

In alto: le tabelle di verità di AND, OR e XOR – la semantica a livello di bit di ogni operazione. In basso: due immagini binarie A e B e il risultato di A.b_and(B), dove il risultato mantiene solo le posizioni che erano attive in entrambi gli input.

5.10.2. Combinare le maschere

L’uso di gran lunga più comune di queste operazioni è combinare le maschere. Una maschera è un’immagine binaria che indica, posizione per posizione, se una certa condizione è soddisfatta. Due maschere che descrivono condizioni diverse si combinano in un’unica maschera che descrive una condizione composta tramite una delle operazioni bitwise:

b_and() produce una maschera le cui posizioni sono attive solo quando entrambe le maschere di input erano attive in quella posizione – il naturale «e» di due condizioni. Combinare una maschera in primo piano con l’output di un passaggio di sogliatura tramite b_and limita le corrispondenze della soglia al primo piano.

b_or() produce una maschera le cui posizioni sono attive ogni volta che almeno una delle maschere di input era attiva – il naturale «o». Eseguire l’OR di due output sogliati produce un’unica maschera che copre tutto ciò che corrispondeva a uno dei due intervalli di colore.

b_xor() produce una maschera le cui posizioni sono attive ogni volta che esattamente una delle maschere di input era attiva. Utile per rilevare le posizioni in cui due maschere differiscono – le posizioni in cui l’output della soglia è cambiato tra due frame, la differenza simmetrica tra due maschere di riferimento, quel tipo di cosa.

Le varianti negate – b_nand(), b_nor(), b_xnor() – producono il complemento delle loro controparti non negate. Sono utili quando il modo naturale per descrivere una condizione è «nessuno di questi» o «non entrambi» – non comune, ma vale la pena sapere che esistono, in modo che la negazione non debba essere composta facendo seguire a un AND un invert() separato.

5.10.3. Bitwise su immagini non binarie

Le operazioni bitwise vengono eseguite anche su immagini in scala di grigi e a colori. Sono più utili lì quando l’immagine contiene contenuto di tipo binario – un frame in scala di grigi i cui pixel sono tutti 0 o 255, un frame RGB565 con solo pixel completamente neri e completamente bianchi – dove AND, OR e XOR danno le stesse combinazioni che darebbero su una vera immagine binaria. Per immagini che coprono l’intero intervallo di valori, le operazioni aritmetiche della pagina precedente sono di solito una scelta migliore.