Question Comment trouver Waldo avec Mathematica?


Cela m'énervait pendant le week-end: Qu'est-ce qu'un bon moyen de résoudre les Où est Waldo?  ['Wally' en dehors de l'Amérique du Nord], en utilisant Mathematica (traitement d'image et autres fonctionnalités)?

Voici ce que j'ai jusqu'ici, une fonction qui réduit un peu la complexité visuelle en diminuant certaines des couleurs non-rouges:

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}]
]

Et un exemple d'URL où cela 'fonctionne':

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

(Waldo est par la caisse enregistreuse):

Mathematica graphic


1511
2017-12-12 18:29


origine


Réponses:


J'ai trouvé Waldo!

waldo had been found

Comment je l'ai fait

D'abord, je filtre toutes les couleurs qui ne sont pas rouges

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

Ensuite, je calcule la corrélation de cette image avec un simple motif noir et blanc pour trouver les transitions rouges et blanches dans la chemise.

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

j'utilise Binarize pour sélectionner les pixels dans l'image avec une corrélation suffisamment élevée et dessiner un cercle blanc autour d'eux pour les mettre en évidence en utilisant Dilation

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

Je devais jouer un peu avec le niveau. Si le niveau est trop élevé, trop de faux positifs sont sélectionnés.

Enfin, je combine ce résultat avec l'image originale pour obtenir le résultat ci-dessus

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

1624
2017-12-12 19:32



Ma conjecture sur une "façon à l'épreuve des balles de faire ceci" (penser que la CIA trouve Waldo dans n'importe quelle image satellite à tout moment, pas seulement une image sans éléments concurrents, comme des chemises rayées) ... Je formerais un Machine Boltzmann sur de nombreuses images de Waldo - toutes les variations de lui assis, debout, occlus, etc .; chemise, chapeau, appareil photo, et toutes les œuvres. Vous n'avez pas besoin d'un grand corpus de Waldos (peut-être que 3-5 suffiront), mais le plus sera le mieux.

Cela assignera des nuages ​​de probabilités aux divers éléments se produisant dans n'importe quel arrangement, puis établira (par segmentation) la taille moyenne de l'objet, fragmentera l'image source en cellules d'objets qui ressemblent le plus à des individus (en considérant les occlusions possibles ), mais comme les images de Waldo incluent généralement BEAUCOUP de personnes à peu près à la même échelle, cela devrait être une tâche très facile, puis nourrir ces segments de la machine Boltzmann pré-formés. Cela vous donnera la probabilité que chacun soit Waldo. Prenez-en un avec la plus grande probabilité.

C'est ainsi que l'OCR, les lecteurs de code postal et la reconnaissance d'écriture sans griffes fonctionnent aujourd'hui. Fondamentalement, vous savez que la réponse est là, vous savez plus ou moins à quoi cela devrait ressembler, et tout le reste peut avoir des éléments communs, mais est certainement "pas le", donc vous ne vous embêtez pas avec le "pas ça", vous il suffit de regarder la probabilité de "ça" parmi tous les "possibles" que vous avez déjà vus "(dans les codes postaux par exemple, vous formeriez BM pour seulement 1s, juste 2s, juste 3s, etc. chiffre à chaque machine, et choisissez celui qui a le plus confiance.) Cela fonctionne beaucoup mieux qu'un réseau neuronal unique d'apprentissage des caractéristiques de tous les nombres.


140
2017-12-12 20:25



Je suis d'accord avec @GregoryKlopper que le droite La façon de résoudre le problème général de la découverte de Waldo (ou de tout objet d'intérêt) dans une image arbitraire serait de former un classificateur d'apprentissage automatique supervisé. En utilisant de nombreux exemples étiquetés positifs et négatifs, un algorithme tel que Machine de vecteur de soutien, Boosted Stump de décision ou Machine Boltzmann pourrait probablement être formé pour atteindre une grande précision sur ce problème. Mathematica inclut même ces algorithmes dans son Cadre d'apprentissage automatique.

Les deux défis avec la formation d'un classificateur Waldo seraient:

  1. Détermination de la transformation d'une entité d'image correcte C'est là que la réponse de @ Heike serait utile: un filtre rouge et un détecteur de modèle dépouillé (par exemple, décomposition en ondelettes ou en transformations) seraient un bon moyen de transformer les pixels bruts en un format dont l'algorithme de classification pourrait tirer profit. Une décomposition basée sur un bloc qui évalue toutes les sous-sections de l'image serait également nécessaire ... mais cela est facilité par le fait que Waldo a) toujours à peu près la même taille et b) toujours présente exactement une fois dans chaque image.
  2. Obtenir suffisamment d'exemples d'entraînement. Les SVM fonctionnent au mieux avec au moins 100 exemples de chaque classe. Les applications commerciales de stimulation (par exemple, la focalisation sur le visage dans les appareils photo numériques) sont formées à des millions d'exemples positifs et négatifs.

Un rapide Recherche d'images Google donne de bonnes données - je vais essayer de rassembler des exemples de formation et de coder ça en ce moment!

Cependant, même une approche d'apprentissage automatique (ou l'approche basée sur des règles suggérée par @iND) se battra pour une image comme la Terre de Waldos!


46
2018-04-01 01:23



Je ne connais pas Mathematica. . . dommage. Mais j'aime la réponse ci-dessus, pour la plupart.

Toujours il y a un défaut majeur en s'appuyant sur les rayures seul glaner la réponse (personnellement, je n'ai pas de problème avec un réglage manuel). Il y a un exemple (listé par Brett Champion, ici) présenté qui montre qu'ils, parfois, brisent le modèle de chemise. Alors, cela devient un modèle plus complexe.

Je voudrais essayer une approche de la forme id et des couleurs, ainsi que des relations spatiales. Tout comme la reconnaissance faciale, vous pouvez rechercher des motifs géométriques à certains ratios les uns des autres. La mise en garde est que généralement une ou plusieurs de ces formes est occlus.

Obtenez une balance des blancs sur l'image et une balance rouge de l'image. Je crois que Waldo a toujours la même valeur / teinte, mais l'image peut provenir d'un scan ou d'une mauvaise copie. Puis toujours se référer à un tableau des couleurs que Waldo est réellement: rouge, blanc, brun foncé, bleu, pêche, {couleur de chaussure}.

Il y a un modèle de chemise, et aussi les pantalons, les lunettes, les cheveux, le visage, les chaussures et le chapeau qui définissent Waldo. En outre, par rapport aux autres personnes dans l'image, Waldo est sur le côté maigre.

Donc, trouver des gens au hasard pour obtenir la hauteur des gens dans cette image. Mesurez la hauteur moyenne d'un tas de choses à des points aléatoires dans l'image (un simple contour produira un certain nombre de personnes). Si chaque chose n'est pas dans un écart-type quelconque, elles sont ignorées pour l'instant. Comparez la moyenne des hauteurs à la hauteur de l'image. Si le rapport est trop important (par exemple, 1: 2, 1: 4 ou similaire), réessayez. Exécutez-le 10 (?) De fois pour vous assurer que les échantillons sont tous assez rapprochés, à l'exclusion de toute moyenne qui est en dehors de certains écarts-types. Possible dans Mathematica?

Ceci est votre taille Waldo. Walso est maigre, donc vous cherchez quelque chose 5: 1 ou 6: 1 (ou quoi que ce soit) ht: wd. Cependant, ce n'est pas suffisant. Si Waldo est partiellement caché, la hauteur pourrait changer. Donc, vous cherchez un bloc de rouge-blanc que ~ 2: 1. Mais il doit y avoir plus d'indicateurs.

  1. Waldo a des lunettes. Recherchez deux cercles 0,5: 1 au-dessus du rouge-blanc.
  2. Pantalon bleu. Toute quantité de bleu à la même largeur dans n'importe quelle distance entre la fin du rouge-blanc et la distance à ses pieds. Notez qu'il porte sa chemise courte, donc les pieds ne sont pas trop près.
  3. Le chapeau. Rouge-blanc n'importe quelle distance jusqu'à deux fois le haut de sa tête. Notez qu'il doit avoir les cheveux foncés ci-dessous, et probablement des lunettes.
  4. Manches longues. rouge-blanc à un certain angle de la principale rouge-blanc.
  5. Cheveux foncés.
  6. Couleur de la chaussure Je ne connais pas la couleur.

N'importe lequel d'entre eux pourrait s'appliquer. Ce sont également des contrôles négatifs contre des personnes similaires sur la photo - par exemple, n ° 2 négation portant un tablier rouge-blanc (trop proche des chaussures), # 5 élimine les cheveux de couleur claire. De plus, la forme n'est qu'un indicateur pour chacun de ces tests. . . la couleur seule dans la distance spécifiée peut donner de bons résultats.

Cela permettra de réduire les zones à traiter.

Stocker ces résultats produira un ensemble de zones devrait Avoir Waldo dedans. Excluez toutes les autres zones (par exemple, pour chaque zone, sélectionnez un cercle deux fois plus grand que la taille moyenne de la personne), puis exécutez le processus que @Heike a défini en supprimant tout sauf le rouge, et ainsi de suite.

Des idées sur la façon de coder cela?


Modifier:

Réflexions sur la façon de coder cela. . . exclure toutes les zones sauf Waldo rouge, squelette les zones rouges, et les élaguer jusqu'à un seul point. Faites de même pour les cheveux Waldo marron, les pantalons Waldo bleus, les chaussures Waldo. Pour la couleur de peau Waldo, excluez, puis trouvez le contour.

Ensuite, excluez les non-rouges, dilatez (beaucoup) toutes les zones rouges, puis squelettisez et élaguez. Cette partie donnera une liste des points centraux possibles de Waldo. Ce sera le marqueur pour comparer toutes les autres sections de couleur Waldo à.

De là, en utilisant les zones rouges squelettisées (pas les zones dilatées), comptez les lignes dans chaque zone. S'il y a le nombre correct (quatre, non?), C'est certainement une zone possible. Sinon, j'imagine que je l'exclurais (comme étant un centre Waldo ... ça pourrait être son chapeau).

Ensuite, vérifiez s'il y a une forme de visage ci-dessus, un point de cheveux ci-dessus, point de pantalon ci-dessous, points de chaussures ci-dessous, et ainsi de suite.

Pas encore de code - toujours en train de lire les docs.


40
2018-01-10 09:36



J'ai une solution rapide pour trouver Waldo en utilisant OpenCV.

J'ai utilisé le correspondance de modèle fonction disponible dans OpenCV pour trouver Waldo.

Pour ce faire, un modèle est nécessaire. J'ai donc découpé Waldo de l'image originale et l'ai utilisé comme modèle.

enter image description here

Ensuite, j'ai appelé le cv2.matchTemplate() fonctionner avec le coefficient de corrélation normalisé comme la méthode utilisée. Il a retourné une probabilité élevée à une seule région comme indiqué en blanc ci-dessous (quelque part dans la région en haut à gauche):

enter image description here

La position de la région probable la plus élevée a été trouvée en utilisant cv2.minMaxLoc() fonction, que j'ai ensuite utilisé pour dessiner le rectangle pour mettre en évidence Waldo:

enter image description here


3
2018-04-11 11:11