5.10. Operaciones a nivel de bits

Las operaciones aritméticas de la página anterior trabajan sobre los valores de los píxeles – los brillos enteros o las palabras de color empaquetadas. Las operaciones a nivel de bits trabajan un nivel más abajo, sobre los bits individuales dentro de esos valores. Para las imágenes binarias, donde cada píxel es solo un bit, las operaciones a nivel de bits son la aritmética natural.

5.10.1. La familia de operaciones a nivel de bits

La clase Image expone el conjunto completo de operaciones a nivel de bits de dos entradas:

Cada una opera bit a bit sobre cada byte de los búferes de ambas imágenes. En una imagen binaria, donde cada byte contiene ocho píxeles, la operación se ejecuta sobre ocho píxeles por byte procesado. En una imagen en escala de grises o en color se ejecuta sobre cada bit de cada canal.

Tres tablas de verdad para las operaciones AND, OR y XOR una al lado de la otra. Cada tabla tiene cuatro filas para las combinaciones de entrada 0-0, 0-1, 1-0, 1-1 y columnas etiquetadas A, B y resultado. Debajo de las tablas de verdad, dos pequeñas imágenes binarias A y B dibujadas como cuadrículas de celdas blancas y negras, con el resultado de aplicarles AND mostrado a la derecha como una cuadrícula que conserva solo las celdas que eran blancas en ambas.

Arriba: las tablas de verdad de AND, OR y XOR – la semántica a nivel de bits de cada operación. Abajo: dos imágenes binarias A y B y el resultado de A.b_and(B), donde el resultado conserva solo las posiciones que estaban activas en ambas entradas.

5.10.2. Combinar máscaras

El uso más común de estas operaciones es combinar máscaras. Una máscara es una imagen binaria que indica, posición por posición, si se cumple alguna condición. Dos máscaras que describen condiciones diferentes se combinan en una sola máscara que describe una condición compuesta mediante una de las operaciones a nivel de bits:

b_and() produce una máscara cuyas posiciones están activas solo cuando ambas máscaras de entrada estaban activas en esa posición – el «y» natural de dos condiciones. Combinar una máscara de primer plano con la salida de una pasada de umbralización mediante b_and restringe las coincidencias del umbral al primer plano.

b_or() produce una máscara cuyas posiciones están activas siempre que cualquiera de las máscaras de entrada estuviera activa – el «o» natural. Aplicar OR a dos salidas umbralizadas produce una sola máscara que cubre cualquier cosa que coincidiera con cualquiera de dos rangos de color.

b_xor() produce una máscara cuyas posiciones están activas siempre que exactamente una máscara de entrada estuviera activa. Útil para detectar posiciones donde dos máscaras difieren – las posiciones donde la salida del umbral cambió entre dos fotogramas, la diferencia simétrica entre dos máscaras de referencia, ese tipo de cosas.

Las variantes negadas – b_nand(), b_nor(), b_xnor() – producen el complemento de sus contrapartes no negadas. Son útiles cuando la forma natural de describir una condición es «ninguno de estos» o «no ambos» – no es común, pero vale la pena saber que existen para que la negación no tenga que componerse siguiendo un AND con un invert() aparte.

5.10.3. Operaciones a nivel de bits en imágenes no binarias

Las operaciones a nivel de bits también se ejecutan en imágenes en escala de grises y en color. Allí son más útiles cuando la imagen contiene contenido de tipo binario – un fotograma en escala de grises cuyos píxeles son todos 0 o 255, un fotograma RGB565 con solo píxeles totalmente negros y totalmente blancos – donde AND, OR y XOR dan las mismas combinaciones que darían en una imagen binaria verdadera. Para imágenes que abarcan todo el rango de valores, las operaciones aritméticas de la página anterior suelen encajar mejor.