viernes, 20 de enero de 2012

Buscando a Wally con Mathematica.

Desde el blog http://gaussianos.com nos llega esta entrada tan curiosa.


Hace algo menos de un mes, en este post de Genbeta Dev nos mostraban una pregunta que se había hecho en Stack Overflow donde se comentaba, agarraos a la silla, si sería posible encontrar a Wally con el programa Mathematica.
¿Cómo? ¿Usar Mathematica para encontrar a Wally (Waldo en inglés) en una de sus famosísimas láminas? Cierto es que Mathematica tiene una potencia bestial como software matemático, pero de ahí a poder usarlo para encontrar a Wally…

Pues sí, se puede, aunque no siempre. Vamos a explicar un poco la información que nos ofrecen en Stack Overflow.
Para comenzar, vamos a usar esta imagen, una de las típicas del famoso juego de buscar a Wally:
Antes de seguir, os animo a que le dediquéis un rato a intentar encontrar a Wally a la vieja usanza.




¿Lo habéis encontrado? Bueno, no importa, vamos a ver y comentar el código que se propone en Stack Overflow para encontrar a Wally (se necesita Mathematica 8):
  • Primero se carga la imagen y se filtran todos los colores que no sean rojos:
    waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/
    Scenes/DepartmentStore.jpg"];
    red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];
  • Después se calcula la correlación entre esa imagen y un patrón simple en blanco y negro para encontrar las transiciones de color rojo y blanco en la camiseta (las rayas, vamos):
    corr = ImageCorrelate[red,
    Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]],
    NormalizedSquaredEuclideanDistance];
  • Ahora se seleccionan los píxeles con una correlación suficientemente alta y se dibuja un círculo blanco a su alrededor:
    pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];
    Hay que tener un poco de cuidado con el nivel que aparece en Binarize, ya que si es demasiado alto aparecen muchos falsos positivos.
  • Al final se combina el resultado con la imagen inicial:
    found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]
Y con todo esto nos aparece el señor Wally:
Parece increíble, ¿verdad?
Pero no es oro todo lo que reluce. El código anterior dista mucho de ser infalible. Con la misma imagen que hemos tratado hay que hilar muy fino con algunos detalles, principalmente con el valor que va en Binarize, como dijimos antes (por ejemplo, con un valor de .16 ya nos aparecen dos falsos Wally). Pero lo peor viene cuando cambiamos de imagen. Si usamos ésta:
con .12, no nos aparece nada. Si vamos subiendo poco a poco ese nivel obtenemos que con .19 sale algo, pero no es Wally, con lo que el código no nos serviría en este caso. Podéis probar con otras imágenes y veréis que la cosa es más complicada de lo que parece. Por tanto, tendremos que seguir buscando a Wally con nuestros ojos y mucha paciencia, como toda la vida…

Fuente: http://gaussianos.com

No hay comentarios:

Publicar un comentario