Wednesday, April 10, 2013

El efecto AT&T y un nuevo reto de la programación lúdica

En 1988 Gerard Holzmann escribió un interesante libro sobre procesamiento de imágenes: "Beyond Photography - The Digital Darkroom". Pocos años antes, el autor trabajó con Rob Pike, Dennis Ritchie, Ken Thompson, entre otros, en los Laboratorios Bell, que a la postre lo adquiriera la empresa ATT. Debe haber sido fascinante interactuar con toda estas gente que trabajaba en tecnología con una pasión desbordada. Ahí nació, por ejemplo, el sistema Unix y el lenguaje C, que no son poca cosa. Hasta donde recuerdo, los Laboratorios Bell tenían a 8 premios Nobel entre sus empleados.



El libro de Holzmann se puede conseguir en Amazon, pero nuevo cuesta 133 dólares. Hay copias usadas por unos 10 dólares. Sin embargo, el propio autor ha puesto una copia en pdf de forma gratuita, y que puede consultarse aquí.

En dicha obra, el el capítulo 4, Holzmann se dedica a experimentar con diferentes filtros gráficos. Muchos de ellos eran meros experimentos bajo la premisa "a ver qué pasa si aplicamos esta ecuación sobre la imagen". Y probablemente muchos de esos experimentos no fueron publicados. Sin embargo, uno de ellos me pareció interesante. Cito al autor en la página 42: "Por alguna razón, el retrato de Peter Weinberg siempre fue el objetivo principal en nuestro experimentos de edición de imágenes.  Todo empezó un par de años antes cuando Peter ascendió a jefe del departamento y a su notoria distracción de dejar su cuadro con su imagen en cualquier parte. Una tarde de sábado, que estábamos bromeando, Rob Pike y yo empezamos a hacer fotocopias de dicha fotografía de Peter, enfatizando la jerarquía administrativa existente cuando preparábamos una gráfica de la estructura de los Laboratorios Bell. Jugando poníamos a Peter en todos los posibles puestos. El propio Peter pronto se dio cuenta de esto y debe haber llegado a la conclusión de que lo mejor que podía hacer era no reaccionar a este asunto. Así al menos él esperaba que su imagen no fuese aparecer magnificada en alguna de las torres de agua del Laboratorio. No obstante, la foto de Peter aparecía y desaparecía en los lugares más extraños.

Un par de semanas después de que ATT revelara el nuevo logotipo corporativo, Tom Duff hizo una imagen de Peter al estilo de dicho logo y se convirtió en el símbolo de nuestro centro de trabajo. Rob Pike mandó hacer camisetas con la foto "ATT-izada" de Peter y Ken Thompson ordenó tazas de café con el logo de Peter. E inevitablemente el 16 de septiembre de 1985 apareció el logo de Peter en una de las torres de agua".

¿Cómo se pueden hacer imágenes de las personas basadas en el logotipo de ATT? Aparentemente Duff fue el autor del filtro y Holzmann no indica cómo se hizo. En consecuencia, hubo que partir de cero información. Consideremos la imagen original y el resultado mostrado por Holzmann:



El logo de ATT es éste:


A partir de esto es claro que las imágenes deben ser de blanco y negro estrictamente. La solución es pues una combinación de filtros. He aquí los pasos a seguir:

  1. Tómese una imagen
  2. Si es de color, pásese a tonos de gris
  3. Ya en tonos de gris, aplíquese el filtro alto contraste
  4. A esa imagen resultante, aplíquese el filtro ATT

Pasar a tonos de gris una imagen es uno de los filtros más comunes. En una imagen en tonos de gris tenemos que cada pixel tiene en sus componentes R=G=B, es decir, la tripleta (Rojo, Verde, Azul) (o (R,G,B) por sus siglas en inglés), tiene los mismos valores. Las imágenes de tonos de grises contienen a lo más 256 tonos diferentes (de (0,0,0), el negro, al (255,255,255) el blanco). Aquí hay dos formas de hacer esta transformación, usando para cada pixel una de las dos posibles ecuaciones:

(1) Gris = (R + G + B) / 3
o
(2) Gris = (0.30 * R) + (0.59 * G) + (0.11 * B)

Ahora bien, una vez teniendo la imagen en tonos de grises, aplicar un filtro alto contraste es fácil. Se recorre la imagen pixel por pixel. Se calcula el número de color, el cual se basa en la siguiente fórmula:


Número de color = (65536 * R) = (256 * G) + (B)

donde las componentes en el modelo R,G,B son: R el componente en rojo, G el verde y B el azul. Si éste número de color es mayor de 8 millones, entonces ponemos un color blanco. Si es menor de ese número, ponemos un color negro. Así, una imagen en tonos de grises se transforma en una imagen en blanco y negro, como en el siguiente ejemplo.


Y ahora está el problema de crear la imagen usando un filtro “ATT alike”. Pero aquí no diré cómo hacer esto (hasta que acabe el reto). Cuando aparezcan los resultados explicaré el filtro a detalle. Es decir, parte del reto es discurrir cómo se puede hacer un filtro de esta naturaleza y no sólo seguir la descripción que pueda hacer yo del mismo. Así pues, el reto tiene este giro adicional, con respecto a retos anteriores.

Los resultados fueron bastante satisfactorios y además, el software crea este tipo de imágenes de forma relativamente rápida. Por ejemplo, he aquí la imagen procesada con regiones de 9 pixeles y otra con regiones de 20 pixeles. Mientras más pixeles por región, más anchas son las franjas oscuras. ¿Cuál de los dos resultados le gusta más?
                 9 pixeles                             20 pixeles

Considerando todo esto, el siguiente reto de la programación lúdica es hacer el filtro ATT. En este caso no se describe cómo funciona ese filtro ATT y el programador que participe debe hallar cómo generar dicho filtro. Es decir, se complica un poco más el asunto, pues la descripción del filtro no se da. Cada quien tendrá que hallarla. Así pues, este reto es aún más complejo que el del filtro óleo.

He aquí las bases adicionales del reto:

  • Ganará el programa que transforme la imagen de Peter Weinberger (que aparece más abajo), en el menor tiempo posible. El segundo mejor tiempo obtendrá el segundo lugar. Desde luego, el resultado debe estar de acuerdo con la definición del filtro ATT del cual hemos hablado.
  • Habrá dos lugares: Ambos se llevarán una taza con el logotipo de La_Morsa. Mi intención es que al imprimir esas tazas aparezca una leyenda con el título de la misma y el lugar obtenido, para que quede constancia por el tiempo de vida de la taza.
  • Los programas pueden hacerse en cualquier lenguaje de propósito general y no se vale usar en éste particularmente, bibliotecas que hagan filtros gráficos. Los programadores tienen que resolver el problema por sí mismo, sin ayuda de bibliotecas externas. (Desde luego, se vale usar alguna biblioteca para cargar/guardar la imagen de Weinberger para procesarla, la cual es un JPG, pero nada más). Así pues, C, C++, C#, Pascal (Delphi), Javascript, Python, Ruby, Visual BASIC, Visual C, Java, etcétera, son idóneos para esta labor.
  • Los autores de los programas deberán mandar el código fuente y el archivo ejecutable en Windows 7.
  • Un autor puede mandar versiones mejoradas de su propio software dentro del tiempo del concurso. No se tomarán en cuenta las que se salgan del tiempo establecido.
  • En la medida de lo posible, el programa debe indicar el tiempo total del proceso realizado para crear la imagen tipo logo de ATT de Weinberger
  • El autor debe enviar el código fuente y quienes ganen aceptan que su código quede accesible para quien lo quiera ver.
  • Los programas deben poderse ejecutar en el sistema operativo Windows 7 de 32/64 bits. Se correrán en una máquina AMD con 6 núcleos y los resultados obtenidos son inapelables y definitivos. De nuevo aclaro: este es un reto de buena fe y no un concurso estrictamente. Los premios son meramente un estímulo extra para que se animen a entrarle al reto. Evidentemente asumo que el código de cada concursante es creación del mismo y que no andan copiando el código de otras partes, foros, sitios en Internet, etcétera. En caso de hallar que el código fue copiado, el programador queda descalificado.
  • El reto dura una semana a partir del día de la publicación del artículo. Por ejemplo, si éste se publica un 10 de mayo a las 3 de la tarde, el reto se cierra el 17 de mayo a esa misma hora.
  • Cuando reciba algún programa participante en el reto, le enviaré un acuse de recibo para asegurarnos que están todos los que son y son todos los que están.
  • El concurso es para quienes viven en la República Mexicana. Si alguien de otro país quiere participar es bienvenido, pero no podrá acceder a los premios (puede haber excepciones).
  • Los programas deben ser enviados a morsa@la-morsa.com o en su defecto a lopem@hotmail.com, por si alguna de las direcciones no funciona.
Así que queridos y entusiastas programadores, a entrarle al reto. Afilen sus herramientas de programación y que gane el mejor.

Imagen a procesar:


A quien le interese el filtro ATT, puede pedírmelo a morsa@la-morsa.com y a vuelta de correo lo recibirá sin costo alguno.

No comments: