Pregunta ¿Cómo encuentro a Waldo con Mathematica?


Esto me estaba molestando durante el fin de semana: ¿Cuál es una buena manera de resolver esos ¿Dónde está Waldo?  ['Criajo' fuera de América del Norte] rompecabezas, utilizando Mathematica (procesamiento de imágenes y otras funcionalidades)?

Esto es lo que tengo hasta ahora, una función que reduce un poco la complejidad visual atenuando algunos de los colores no rojos:

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

Y un ejemplo de una URL donde esto 'funciona':

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(Waldo está junto a la caja registradora):

Mathematica graphic


1511
2017-12-12 18:29


origen


Respuestas:


¡Encontré a Waldo!

waldo had been found

Cómo lo hice

Primero, estoy filtrando todos los colores que no son rojos

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

Luego, estoy calculando la correlación de esta imagen con un patrón simple en blanco y negro para encontrar las transiciones rojas y blancas en la camisa.

corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];

yo suelo Binarize para seleccionar los píxeles en la imagen con una correlación suficientemente alta y dibujar un círculo blanco alrededor de ellos para enfatizarlos usando Dilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

Tuve que jugar un poco con el nivel. Si el nivel es demasiado alto, se eligen demasiados falsos positivos.

Finalmente estoy combinando este resultado con la imagen original para obtener el resultado anterior

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

1624
2017-12-12 19:32



Supongo que es una "forma a prueba de balas para hacer esto" (creo que la CIA encuentra a Waldo en cualquier imagen de satélite en cualquier momento, no solo una imagen sin elementos en competencia, como camisas a rayas) ... Yo entrenaba una Máquina Boltzmann en muchas imágenes de Waldo, todas las variaciones de él sentado, de pie, ocluido, etc .; camisa, sombrero, cámara y todos los trabajos. No necesitas un gran corpus de Waldos (quizás 3-5 serán suficientes), pero cuanto más, mejor.

Esto asignará nubes de probabilidades a varios elementos que ocurren en la disposición correcta, y luego establecerá (mediante segmentación) el tamaño promedio de un objeto, fragmentará la imagen fuente en celdas de objetos que se asemejan más a personas individuales (considerando posibles oclusiones y cambios de postura) ), pero dado que las imágenes de Waldo suelen incluir MUCHAS personas en la misma escala, esta debería ser una tarea muy fácil, luego alimenta estos segmentos de la máquina Boltzmann pre-entrenada. Te dará la probabilidad de que cada uno sea Waldo. Tome uno con la mayor probabilidad.

Así es como funcionan actualmente el OCR, los lectores de códigos postales y el reconocimiento de escritura sin movimiento. Básicamente, usted sabe que la respuesta está ahí, usted sabe más o menos cómo debería verse, y todo lo demás puede tener elementos comunes, pero definitivamente no es "así", por lo que no se molesta con el "no es", usted solo mire la probabilidad de "eso" entre todos los posibles "es" que haya visto antes "(en los códigos postales, por ejemplo, entrenaría a BM por solo 1, solo 2, solo 3, etc., luego alimentar a cada uno dígitos a cada máquina, y elija uno que tenga más confianza). Esto funciona mucho mejor que una red neuronal única que aprende las características de todos los números.


140
2017-12-12 20:25



Estoy de acuerdo con @GregoryKlopper en que derecho La forma de resolver el problema general de encontrar Waldo (o cualquier objeto de interés) en una imagen arbitraria sería entrenar a un clasificador supervisado de aprendizaje automático. Usando muchos ejemplos etiquetados positivos y negativos, un algoritmo como Máquinas de vectores soporte, Boom Tomado de decisión o la máquina Boltzmann podría ser entrenada para lograr una alta precisión en este problema. Mathematica incluso incluye estos algoritmos en su Marco de aprendizaje de la máquina.

Los dos desafíos al entrenar un clasificador de Waldo serían:

  1. Determinar la transformación de la función de imagen correcta. Aquí es donde la respuesta de @Heike sería útil: un filtro rojo y un detector de patrones eliminados (por ejemplo, descomposición wavelet o DCT) sería una buena manera de convertir píxeles sin procesar en un formato que el algoritmo de clasificación podría aprender. También se requeriría una descomposición basada en bloques que evalúe todas las subsecciones de la imagen ... pero esto es más fácil por el hecho de que Waldo es a) siempre más o menos del mismo tamaño yb) siempre presente exactamente una vez en cada imagen.
  2. Obteniendo suficientes ejemplos de entrenamiento. Las SVM funcionan mejor con al menos 100 ejemplos de cada clase. Las aplicaciones comerciales de refuerzo (por ejemplo, el enfoque facial en cámaras digitales) se entrenan en millones de ejemplos positivos y negativos.

Un rápido Búsqueda de imágenes de Google obtiene buena información. ¡Voy a intentar recopilar algunos ejemplos de entrenamiento y codificar esto ahora mismo!

Sin embargo, incluso un enfoque de aprendizaje automático (o el enfoque basado en reglas sugerido por @iND) luchará por una imagen como la Tierra de Waldos!


46
2018-04-01 01:23



No sé Mathematica. . . demasiado. Pero me gusta la respuesta anterior, en su mayor parte.

Todavía hay un gran defecto en confiar en las rayas solo para obtener la respuesta (personalmente no tengo ningún problema con uno ajuste manual). Hay un ejemplo (enumerado por Brett Champion, aquí) presentado que muestra que, a veces, rompen el patrón de la camisa. Entonces se convierte en un patrón más complejo.

Intentaría un enfoque de id de forma y colores, junto con las relaciones espaciales. Al igual que el reconocimiento facial, puedes buscar patrones geométricos a ciertas proporciones entre sí. La advertencia es que generalmente una o más de esas formas está ocluida.

Obtenga un balance de blancos en la imagen y un balance rojo en la imagen. Creo que Waldo siempre tiene el mismo valor / tono, pero la imagen puede ser de un escaneo o una mala copia. Luego, siempre haga referencia a una matriz de los colores que Waldo realmente es: rojo, blanco, marrón oscuro, azul, melocotón, {color del zapato}.

Hay un patrón de camisa, y también los pantalones, gafas, cabello, cara, zapatos y sombrero que definen a Waldo. Además, en relación con otras personas en la imagen, Waldo está en el lado flaco.

Entonces, encuentre personas al azar para obtener la estatura de las personas en esta foto. Mida la altura promedio de un grupo de cosas en puntos aleatorios en la imagen (un esquema simple producirá bastantes personas individuales). Si cada cosa no está dentro de una desviación estándar entre sí, se ignoran por el momento. Compara el promedio de alturas con la altura de la imagen. Si la proporción es demasiado grande (p. Ej., 1: 2, 1: 4 o similarmente cerca), inténtelo de nuevo. Ejecútelo 10 (?) Veces para asegurarse de que las muestras estén muy juntas, excluyendo cualquier promedio que esté fuera de alguna desviación estándar. Posible en Mathematica?

Este es tu tamaño de Waldo. Walso es delgado, entonces estás buscando algo 5: 1 o 6: 1 (o lo que sea) ht: wd. Sin embargo, esto no es suficiente. Si Waldo está parcialmente oculto, la altura podría cambiar. Entonces, estás buscando un bloque de rojo-blanco que ~ 2: 1. Pero tiene que haber más indicadores.

  1. Waldo tiene lentes. Busque dos círculos 0.5: 1 sobre el rojo-blanco.
  2. Pantalones azules. Cualquier cantidad de azul con el mismo ancho dentro de cualquier distancia entre el final del rojo-blanco y la distancia a sus pies. Tenga en cuenta que él usa su camisa corta, por lo que los pies no están demasiado cerca.
  3. El sombrero. Rojo-blanco cualquier distancia hasta el doble de la parte superior de su cabeza. Tenga en cuenta que debe tener cabello oscuro debajo, y probablemente gafas.
  4. Mangas largas rojo-blanco en algún ángulo desde el rojo-blanco principal.
  5. Pelo oscuro.
  6. Color de zapatos No sé el color.

Cualquiera de esos podría aplicar. Estos también son controles negativos contra personas similares en la foto; por ejemplo, el n. ° 2 niega llevar un delantal rojo-blanco (demasiado cerca de los zapatos), el n. ° 5 elimina el pelo de color claro. Además, la forma es solo un indicador para cada una de estas pruebas. . . el color solo dentro de la distancia especificada puede dar buenos resultados.

Esto reducirá las áreas a procesar.

Almacenar estos resultados generará un conjunto de áreas que debería tener a Waldo en ella. Excluya todas las demás áreas (por ejemplo, para cada área, seleccione un círculo dos veces más grande que el tamaño promedio de la persona), y luego ejecute el proceso que @Heike estableció eliminando todo excepto el rojo, y así sucesivamente.

¿Alguna idea sobre cómo codificar esto?


Editar:

Pensamientos sobre cómo codificar esto. . . excluya todas las áreas excepto Waldo rojo, esqueletice las áreas rojas y póngalas en un solo punto. Haz lo mismo con el pelo marrón Waldo, los pantalones Waldo azules, el color del zapato Waldo. Para el color de la piel de Waldo, excluya y luego encuentre el contorno.

Luego, excluya no rojo, dilate (mucho) todas las áreas rojas, luego esqueletice y pode. Esta parte dará una lista de posibles puntos del centro de Waldo. Este será el marcador para comparar todas las demás secciones de color de Waldo.

Desde aquí, usando las áreas rojas esqueletizadas (no las dilatadas), cuente las líneas en cada área. Si existe el número correcto (cuatro, ¿no?), Esta es ciertamente una zona posible. Si no, supongo que lo excluiré (como ser un centro de Waldo ... aún puede ser su sombrero).

A continuación, compruebe si hay una forma de cara arriba, una punta de pelo arriba, puntos de pantalón debajo, puntos de zapato debajo, y así sucesivamente.

Aún no hay código, sigue leyendo los documentos.


40
2018-01-10 09:36



Tengo una solución rápida para encontrar a Waldo usando OpenCV.

Usé el comparación de plantillas función disponible en OpenCV para encontrar Waldo.

Para hacer esto, se necesita una plantilla. Así que recorté Waldo de la imagen original y lo usé como plantilla.

enter image description here

Luego llamé al cv2.matchTemplate() funcionar junto con el coeficiente de correlación normalizado como el método usado. Devolvió una alta probabilidad en una sola región como se muestra en blanco a continuación (en algún lugar en la región superior izquierda):

enter image description here

La posición de la región más alta probable se encontró usando cv2.minMaxLoc() función, que luego usé para dibujar el rectángulo para resaltar Waldo:

enter image description here


3
2018-04-11 11:11