Encuentra a Wally con Mathematica…pero sólo a veces

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…


Como habréis observado, la descripción de cada paso del código que os he puesto no es mía, sino que básicamente la he traducido de Stack Overflow. Por desgracia mis conocimientos de Mathematica no llegan a comprender en su totalidad el código, por lo que ahora mismo no sé si modificando algún otro detalle del mismo podríamos mejorarlo lo suficiente para adaptarlo a cualquier imagen posible. Por ello os pido a quienes controléis Mathematica que nos contéis qué mejoras se os ocurren para que podamos ir probando.


Actualización: Más información sobre el tema en estos dos posts de keshav[saharia_].com:

Share

4 comentarios

  1. Trackback | 20 ene, 2012

    Bitacoras.com

  2. Ramiro Hum-Sah | 20 de enero de 2012 | 07:20

    Vótalo Thumb up 0

    Jajaja los que nos faltaba Mathematica es más omnipotente aún de lo que sabía :)

  3. Trackback | 20 ene, 2012

    ¿Se puede encontrar a Wally con Mathematica? | Codigo Geek

  4. Trackback | 20 ene, 2012

    Buscando a Wally usando Mathematica | CyberHades

Escribe un comentario

Puedes utilizar código LaTeX para insertar fórmulas en los comentarios. Sólo tienes que escribir
[latex]código-latex-que-quieras-insertar[/latex]
o
$latex código-latex-que-quieras-insertar$.

Si tienes alguna duda sobre cómo escribir algún símbolo puede ayudarte la Wikipedia. Utiliza la Vista Previa antes de publicar tu comentario para asegurarte de que las fórmulas están correctamente escritas.