Monday, May 14, 2018

"Un-dithering" de una imagen


Hemos visto aquí uno de los esquemas más sencillos para hacer dithering de una fotografía, es decir, tomar una imagen con 256 tonos de gris, por ejemplo, y convertirla solamente a dos colores, buscando que la imagen no pierda tanta información como para que no pueda ser reconocida.

El proceso de dithering se encuentra en muchas de las cosas que hacemos con cotidianidad. Por ejemplo, los periódicos, revistas y libros, imprimen con pocas tintas y tienen que "simular" que se tienen más colores, cosa que hacen haciendo un entramado de los colores disponibles para así engañar al ojo aunque en realidad estamos engañando al cerebro, quien es el que interpreta las imágenes que perciben los ojos.

Aquí hablamos de uno de los esquemas más sencillos, el dithering al azar, el cual dado cada punto de una imagen, se genera un número al azar en el rango de 0 a 255. Si el valor al azar es mayor que el valor del pixel, entonces se pinta un punto blanco, sino, se pinta uno negro. Así de simple. Otros esquemas de dithering, de los cuales hablaremos próximamente, como en el caso del sistema de Floyd-Steinberg, usa una matriz que toma valores muy específicos y se aplican a los pixeles de cierta manera, lo que al final da como resultado una imagen ditherizada mucho mejor que la que se puede realizar con el método al azar.

Pues bien, tomemos la imagen de Lena, un clásico del proceso digital de imágenes y apliquémosle el esquema de Floyd-Steinberg. Este será el resultado:


Lena (original)


Lena (dithering Floyd-Steinberg)

Puede verse que la imagen se ve relativamente bien pero la pregunta entonces es, ¿dada una imagen ditherizada, podemos regresarla a la imagen original? La respuesta simple es NO. La razón de esto es que cuando una imagen se ditheriza, se pierde información y por ende, en principio al menos no es posible reconstruirla y regresar a la imagen original. De hecho, esto es parecido a lo que se ha intentado por años, colorizar fotografías en blanco y negro (tonos de gris). En algunos casos es posible si se tiene información externa, por ejemplo, en el caso de las fotografías de la Segunda Guerra Mundial, probablemente en algún museo se encuentren las ropas que usaban los soldados en ese momento histórico y entonces se puede tener una referencia sobre el color, el cual desde luego, se perdió en una foto en tonos de gris.

Buscando más información encontré un artículo que salió en la revista Dr. Dobbs Journal, ya desaparecida. El autor, Allen Stenger, intenta precisamente regresar a la imagen original a partir de una imagen ditherizada. El artículo puede leerse aquí.

Aunque el trabajo de Stenger no es difícil de seguir, podemos tomar dos elementos fundamentales: toma una matriz de 4x4 pixeles y le aplica una convolución, es decir, un proceso aritmético de sumas y restas entre los pixeles de interés para así lograr efectos como hacer más borrosa una imagen, o bien, hacerla con más detalles, o encontrar los bordes, entre muchos efectos posibles. La convolución de imágenes (y de señales), es un tema común y es relativamente sencillo de hacer.

Pues bien, Stenger sugiere una matriz de 4x4 pixeles para hacer un filtro "blur", el cual hace que la imagen sea más borrosa. La idea de esto es que la imagen ditherizada se convierta -en lo posible- en tonos de gris. Desde luego esto tiene sus limitaciones pero es una idea razonable. Curiosamente Stenger usa una matriz par y el punto de interés, es decir, en donde se aplica la convolución de la matriz, es el de la esquina inferior izquierda. Una vez realizada esta convolución, Stenger usa una matriz de 3x3 pixeles para usar un nuevo filtro de convolución: "sharpen", que busca que se enfaticen los detalles de la imagen.

Decidí probar la idea de Stenger y usando unas rutinas de convolución para Delphi, que pueden descargarse de este sitio, apliqué los filtros de convolución, aunque no usé como Stenger el de 4x4, sino que usé uno de 3x3. Probablemente en algún momento decida ver si el filtro de 4x4 mejora significativamente el resultado final.

He aquí las pruebas. En la primera imagen se ve la imagen de Lena, la original. La siguiente imagen es Lena ditherizada con Floyd-Steinberg. Las imágenes siguientes son el proceso inverso usando las rutinas de convolución que hallé.


Lena (convolución "blur")


Lena (convolución "blur" + "sharpen")

¿Cómo lo valora el lector? ¿Es una buena idea para tratar de recuperar la imagen original? ¿Algo así como "de lo perdido lo encontrado"?

No comments: