5.10. Opérations bit à bit¶
Les opérations arithmétiques de la page précédente travaillent sur les valeurs des pixels – les luminosités entières ou les mots de couleur compactés. Les opérations bit à bit travaillent un niveau plus bas, sur les bits individuels à l’intérieur de ces valeurs. Pour les images binaires, où chaque pixel n’est qu’un seul bit, les opérations bit à bit sont l’arithmétique naturelle.
5.10.1. La famille bit à bit¶
La classe Image expose l’ensemble complet des opérations bit à bit à deux entrées :
b_and()– ET bit à bit.b_or()– OU bit à bit.b_xor()– OU exclusif bit à bit.b_nand()– NON-ET.b_nor()– NON-OU.b_xnor()– NON-OU-exclusif.
Chacune opère bit par bit sur chaque octet des tampons des deux images. Sur une image binaire, où chaque octet contient huit pixels, l’opération s’exécute sur huit pixels par octet traité. Sur une image en niveaux de gris ou en couleur, elle s’exécute sur chaque bit de chaque canal.
En haut : les tables de vérité du ET, du OU et du OU exclusif – la sémantique au niveau du bit de chaque opération. En bas : deux images binaires A et B et le résultat de A.b_and(B), où le résultat ne conserve que les positions qui étaient actives dans les deux entrées.¶
5.10.2. Combiner des masques¶
L’utilisation de loin la plus courante de ces opérations est la combinaison de masques. Un masque est une image binaire qui indique, position par position, si une certaine condition est remplie. Deux masques décrivant des conditions différentes se combinent en un seul masque décrivant une condition composée à l’aide de l’une des opérations bit à bit :
b_and() produit un masque dont les positions sont actives uniquement lorsque les deux masques d’entrée étaient actifs à cette position – le « et » naturel de deux conditions. Combiner un masque de premier plan avec la sortie d’une passe de seuillage via b_and restreint les correspondances du seuil au premier plan.
b_or() produit un masque dont les positions sont actives dès que l’un ou l’autre masque d’entrée était actif – le « ou » naturel. Combiner par OU deux sorties seuillées produit un seul masque couvrant tout ce qui correspondait à l’une ou l’autre de deux plages de couleurs.
b_xor() produit un masque dont les positions sont actives dès qu”exactement un masque d’entrée était actif. Utile pour détecter les positions où deux masques divergent – les positions où la sortie du seuil a changé entre deux trames, la différence symétrique entre deux masques de référence, ce genre de chose.
Les variantes négatives – b_nand(), b_nor(), b_xnor() – produisent le complément de leurs homologues non négatifs. Elles sont utiles lorsque la façon naturelle de décrire une condition est « ni l’un ni l’autre » ou « pas les deux » – ce n’est pas courant, mais il est bon de savoir qu’elles existent afin de ne pas avoir à composer la négation en faisant suivre un ET d’un invert() distinct.
5.10.3. Bit à bit sur des images non binaires¶
Les opérations bit à bit s’exécutent également sur les images en niveaux de gris et en couleur. Elles y sont le plus utiles lorsque l’image contient un contenu de type binaire – une trame en niveaux de gris dont les pixels valent tous 0 ou 255, une trame RGB565 ne comportant que des pixels entièrement noirs et entièrement blancs – où ET, OU et OU exclusif donnent les mêmes combinaisons que sur une véritable image binaire. Pour les images couvrant toute la plage des valeurs, les opérations arithmétiques de la page précédente conviennent généralement mieux.