Saturday, November 17, 2018

Dithering: su fundamento


Hoy en día contamos con tarjetas gráficas que pueden mostrar luminosos colores en la pantalla de la computadora. Vamos, hasta los teléfonos ya tienen resoluciones de alta definición en muchos casos y pueden desplegar millones de diferentes colores. Considerando esto, resulta quizás para algún lector un poco absurdo que alguien quiera pasar una imagen en tonos de grises a blanco y negro, pero esto es un proceso que se hace continuamente cuando, por ejemplo, queremos imprimir una fotografía (en color o tonos de grises), teniendo solamente un dispositivo que imprime con tinta negra.

Es decir, tenemos dos posibles colores: puntos negros (tinta) y puntos blancos (sin tinta). Con ello debemos poder representar la imagen de la mejor manera, intentando no perder información o al menos, perder lo menos posible. Ya aquí hemos hablado de algunos procesos interesantes para hacer esto. Uno de ellos es el “dithering al azar” (o random), o bien, el usar la técnica de los semitonos. Los resultados con ambos procedimientos pueden ser mejores o peores, de acuerdo muchas veces a la imagen a procesar.

Sin embargo, el tema no se ha agotado. El dithering finalmente se basa en algo fundamental, que es la difusión del error de un punto al siguiente. Por ejemplo, consideremos que en una imagen en tonos de gris (donde cada punto tiene el mismo valor en rojo, verde y azul), en RGB, y veamos una de las coordenadas, por ejemplo el ROJO. Supongamos que en una línea de pixeles tenemos los valores 0, 96, 96, …, etcétera. Veamos cómo podemos hacer dithering usando esta difusión de error de punto a punto.

Si vemos el primer pixel, hallaremos que el primer valor es cero, que es negro, por lo que mandaremos a la impresora para que pinte en el papel un punto negro. Pasamos al siguiente y vemos que es un 96. ¿Este valor está más cerca o más lejos del negro? La respuesta es simple: si tenemos valores del 0 (negro) al 255 (blanco), entonces el 96 está más cerca del negro que del blanco. ¿Cuál es el error en este caso? 96 pasos, es decir, el tono de gris 96 está precisamente a 96 pasos del cero y esto es el error. Ahora tomemos el valor del siguiente ROJO. Hallamos que de nuevo es un tono de gris 96. Entonces vamos a hacer la difusión de error que acarreamos (96) al nuevo valor, que es 96. la suma de ambos da 192. Ahora nos preguntamos: ¿Este valor está más cerca o menos cerca del blanco? 192 está a 63 pasos del blanco. este es el error. Como es hacia el blanco, vamos a decir que está a -63 pasos. Pintaremos un punto blanco y el error se sumará al siguiente pixel.

Este elemental algoritmo, escrito en Delphi, se ve así:



Vayamos a las pruebas. Tomemos la foto de Ilse y pasémosla a tonos de gris:



Y procesémosla con este algoritmo. El resultado es éste:



Puede verse que el resultado no queda mal pero se ven algunos “artefactos”, es decir, ruido en la imagen o puntos indeseables. Tomemos ahora la imagen de Abraham Lincoln y observemos los resultados:



y el resultado:



Aquí las cosas mejoraron. La razón es que este método de difusión simple tiene dificultades cuando tiene que ir de blanco a negro y viceversa. Sin embargo, el asunto es que al hacer esta difusión del error, estamos aplicando le principio básico de todos estos mecanismos para hacer dithering.

En próximos artículo hablaremos de dithering más sofisticado, como el creado por Floyd-Steinberg.

No comments: