Frage Wie finde ich Waldo mit Mathematica?


Das nervte mich am Wochenende: Was ist ein guter Weg, um diese zu lösen? Wo ist Waldo?  ["Wally" außerhalb von Nordamerika] Puzzles, mit Mathematica (Bildverarbeitung und andere Funktionalität)?

Hier ist, was ich bisher habe, eine Funktion, die durch Dimmen die visuelle Komplexität etwas reduziert einige der nicht-roten Farben:

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

Und ein Beispiel für eine URL, wo dies 'funktioniert':

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

(Waldo ist an der Kasse):

Mathematica graphic


1511
2017-12-12 18:29


Ursprung


Antworten:


Ich habe Waldo gefunden!

waldo had been found

Wie ich es gemacht habe

Zuerst filtere ich alle Farben heraus, die nicht rot sind

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

Als nächstes berechne ich die Korrelation dieses Bildes mit einem einfachen Schwarz-Weiß-Muster, um die roten und weißen Übergänge im Hemd zu finden.

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

ich benutze Binarize um die Pixel im Bild mit einer ausreichend hohen Korrelation auszuwählen und einen weißen Kreis um sie herum zu zeichnen, um sie mit zu betonen Dilation

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

Ich musste ein wenig mit dem Level herumspielen. Wenn der Pegel zu hoch ist, werden zu viele falsche Positive herausgefiltert.

Schließlich kombiniere ich dieses Ergebnis mit dem Originalbild, um das Ergebnis oben zu erhalten

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

1624
2017-12-12 19:32



Ich rate zu einer "kugelsicheren Methode, dies zu tun" (denke CIA finde Waldo in jedem Satellitenbild zu jeder Zeit, nicht nur ein einzelnes Bild ohne konkurrierende Elemente, wie gestreifte Hemden) ... Ich würde trainieren Boltzmann-Maschine auf vielen Bildern von Waldo - alle Variationen von ihm sitzend, stehend, okkludiert usw .; Hemd, Hut, Kamera und alle Arbeiten. Sie brauchen kein großes Korpus von Waldos (vielleicht 3-5 wird ausreichen), aber je mehr desto besser.

Dies teilt verschiedenen Elementen, die in der richtigen Anordnung vorkommen, Wolkenwahrscheinlichkeiten zu und stellt dann (über die Segmentierung) fest, wie groß die durchschnittliche Objektgröße ist. Zerstückeln Sie das Quellbild in Zellen von Objekten, die am ehesten individuellen Personen ähneln (mögliche Okklusionen und Poseänderungen) ), aber da Waldo Bilder normalerweise eine Menge Leute in ungefähr der gleichen Skala einschließen, sollte dies eine sehr leichte Aufgabe sein, dann diese Segmente der vortrainierten Boltzmann-Maschine füttern. Es wird Ihnen die Wahrscheinlichkeit geben, dass jeder Waldo ist. Nimm einen mit der höchsten Wahrscheinlichkeit.

So funktionieren heute OCR, Postleitzahlenleser und hublose Handschrifterkennung. Im Grunde weißt du, dass die Antwort da ist, du weißt mehr oder weniger, wie es aussehen sollte, und alles andere mag gemeinsame Elemente haben, ist aber definitiv "nicht", also kümmerst du dich nicht um das "nicht-du" Schau dir einfach die Wahrscheinlichkeit von "es" unter allen möglichen "it" s, die du zuvor gesehen hast (in Postleitzahlen zum Beispiel trainierst du BM für nur 1s, nur 2s, nur 3s, etc., dann füttere jedes Wählen Sie eine Maschine, die am meisten Vertrauen hat.) Dies funktioniert viel besser als ein einzelnes neuronales Netzwerk, das Funktionen aller Zahlen lernt.


140
2017-12-12 20:25



Ich stimme @GregoryKlopper zu, dass die Recht Die Lösung des allgemeinen Problems, Waldo (oder irgendein Objekt von Interesse) in einem beliebigen Bild zu finden, würde darin bestehen, einen überwachten Klassifizierer für maschinelles Lernen zu schulen. Unter Verwendung vieler positiv und negativ markierter Beispiele wurde ein Algorithmus wie z Support-Vektor-Maschine, Erhöhter Entscheidungsstumpf oder Boltzmann Machine könnte wahrscheinlich trainiert werden, um eine hohe Genauigkeit bei diesem Problem zu erreichen. Mathematica enthält diese Algorithmen sogar in seinen Machine Learning Framework.

Die zwei Herausforderungen beim Training eines Waldo-Klassifikators wären:

  1. Bestimmen der richtigen Bildmerkmalstransformation. Hier ist die Antwort von Heike nützlich: Ein Rotfilter und ein Detektor für abisolierte Muster (z. B. Wavelet- oder DCT-Zerlegung) wären eine gute Möglichkeit, rohe Pixel in ein Format umzuwandeln, von dem der Klassifikationsalgorithmus lernen könnte. Eine blockbasierte Zerlegung, die alle Teilbereiche des Bildes bewertet, wäre ebenfalls erforderlich ... aber dies wird dadurch erleichtert, dass Waldo a) immer ungefähr gleich groß ist und b) in jedem Bild immer genau einmal vorkommt.
  2. Beziehen Sie genügend Trainingsbeispiele. SVMs funktionieren am besten mit mindestens 100 Beispielen jeder Klasse. Kommerzielle Anwendungen der Verstärkung (z. B. die Gesichtsfokussierung in Digitalkameras) werden auf Millionen von positiven und negativen Beispielen trainiert.

Ein schneller Google-Bildersuche stellt einige gute Daten zusammen - ich werde versuchen, einige Trainingsbeispiele zu sammeln und dies jetzt zu programmieren!

Aber selbst ein maschineller Lernansatz (oder der regelbasierte Ansatz, der von @iND vorgeschlagen wird) wird für ein Bild wie das Land von Waldos!


46
2018-04-01 01:23



Ich kenne Mathematica nicht. . . schade. Aber ich mag die obige Antwort größtenteils.

Dennoch gibt es einen großen Fehler, wenn man sich auf die Streifen verlässt allein um die Antwort zu lesen (ich persönlich habe kein Problem damit ein Manuelle Einstellung). Es gibt ein Beispiel (aufgeführt von Brett Champion, Hier) präsentiert, die zeigt, dass sie manchmal das Hemdmuster aufbrechen. So wird es zu einem komplexeren Muster.

Ich würde eine Annäherung von Formidentifikation und Farben zusammen mit räumlichen Beziehungen versuchen. Ähnlich wie die Gesichtserkennung können Sie geometrische Muster in bestimmten Verhältnissen zueinander suchen. Der Nachteil ist, dass normalerweise eine oder mehrere dieser Formen verschlossen sind.

Erhalten Sie einen Weißabgleich auf dem Bild und einen Rotabgleich aus dem Bild. Ich glaube, Waldo ist immer der gleiche Wert / Farbton, aber das Bild kann von einem Scan oder einer schlechten Kopie stammen. Beziehe dich dann immer auf eine Reihe von Farben, die Waldo eigentlich ist: Rot, Weiß, Dunkelbraun, Blau, Pfirsich, {Schuhfarbe}.

Es gibt ein Shirt-Muster, und auch die Hose, Brille, Haare, Gesicht, Schuhe und Hut, die Waldo definieren. Auch im Vergleich zu anderen Menschen auf dem Bild ist Waldo auf der mageren Seite.

Finde also zufällige Personen, um die Höhe der Leute in diesem Bild zu erhalten. Messen Sie die durchschnittliche Höhe einer Menge von Dingen an zufälligen Punkten im Bild (ein einfacher Umriss wird ziemlich viele einzelne Personen erzeugen). Wenn jede Sache nicht innerhalb einer Standardabweichung voneinander ist, werden sie für jetzt ignoriert. Vergleichen Sie den Durchschnitt der Höhen mit der Bildhöhe. Wenn das Verhältnis zu groß ist (z. B. 1: 2, 1: 4 oder ähnlich nah), versuchen Sie es erneut. Führen Sie es 10 (?) Male durch, um sicherzustellen, dass die Samples alle ziemlich nah beieinander sind, ausgenommen jeden Durchschnitt, der außerhalb einiger Standardabweichungen liegt. In Mathematica möglich?

Das ist deine Waldo-Größe. Waldo ist mager, also suchst du nach etwas 5: 1 oder 6: 1 (oder was auch immer) ht: wd. Dies ist jedoch nicht ausreichend. Wenn Waldo teilweise versteckt ist, könnte sich die Höhe ändern. Also, Sie suchen nach einem Block von Rot-Weiß, dass ~ 2: 1. Aber es muss mehr Indikatoren geben.

  1. Waldo hat eine Brille. Suche nach zwei Kreisen 0,5: 1 über dem Rot-Weiß.
  2. Blaue Hosen. Jede Menge Blau auf der gleichen Breite innerhalb eines Abstands zwischen dem Ende des Rot-Weiß und der Entfernung zu seinen Füßen. Merken Sie, dass er sein Hemd kurz trägt, also sind die Füße nicht zu nah.
  3. Der Hut. Rot-weiß jede Entfernung bis zum doppelten Kopf. Beachten Sie, dass es unten dunkle Haare haben muss, und wahrscheinlich Gläser.
  4. Lange Ärmel. rot-weiß in einem Winkel von der Haupt rot-weiß.
  5. Dunkles Haar.
  6. Schuhfarbe. Ich kenne die Farbe nicht.

Jeder von denen könnte sich bewerben. Dies sind auch negative Kontrollen gegen ähnliche Personen im Bild - z. B. # 2 negiert das Tragen einer rot-weißen Schürze (zu nah an Schuhen), # 5 beseitigt helle Haare. Außerdem ist die Form nur ein Indikator für jeden dieser Tests. . . Farbe allein innerhalb der angegebenen Entfernung kann zu guten Ergebnissen führen.

Dies wird die zu verarbeitenden Bereiche eingrenzen.

Speichern dieser Ergebnisse wird eine Reihe von Bereichen erzeugen, die sollte hab Waldo drin. Schließen Sie alle anderen Bereiche aus (z. B. für jeden Bereich einen Kreis, der doppelt so groß ist wie die durchschnittliche Personengröße), und führen Sie dann den Prozess aus, den @Heike angelegt hat, indem er alles außer rot entfernt hat und so weiter.

Irgendwelche Gedanken darüber, wie das zu programmieren ist?


Bearbeiten:

Gedanken darüber, wie das zu programmieren ist. . . schließen Sie alle Bereiche aus, aber Waldo rot, skelettieren Sie die roten Bereiche und schneiden Sie sie auf einen einzelnen Punkt zurück. Machen Sie das gleiche für Waldo Haar braun, Waldo Hose blau, Waldo Schuhfarbe. Für Waldo Hautfarbe, ausschließen, dann finden Sie den Umriss.

Als nächstes schließen Sie nicht rot aus, dehnen (viel) alle roten Bereiche aus, dann skelettieren und beschneiden. Dieser Teil gibt eine Liste möglicher Waldo-Mittelpunkte. Dies wird der Markierer sein, um alle anderen Waldo Farbabschnitte zu vergleichen.

Von hier aus, mit den skelettierten roten Bereichen (nicht den erweiterten), zählen Sie die Linien in jedem Bereich. Wenn da die richtige Nummer ist (vier, oder?), Ist das sicher ein möglicher Bereich. Wenn nicht, schätze ich es einfach aus (da es sich um ein Waldo-Zentrum handelt... Kann es immer noch sein Hut sein).

Dann überprüfe, ob oben eine Gesichtsform, oben ein Haaransatz, darunter ein Hosenpunkt, darunter ein Schuhpunkt und so weiter.

Noch kein Code - immer noch die Dokumente lesen.


40
2018-01-10 09:36



Ich habe eine schnelle Lösung, um Waldo mit OpenCV zu finden.

Ich habe das benutzt Vorlagenabgleich Funktion in OpenCV verfügbar, um Waldo zu finden.

Dazu wird eine Vorlage benötigt. Also habe ich Waldo vom Originalbild abgeschnitten und es als Vorlage benutzt.

enter image description here

Als nächstes rief ich an cv2.matchTemplate() Funktion zusammen mit der normalisierter Korrelationskoeffizient als die verwendete Methode. Es ergab eine hohe Wahrscheinlichkeit in einer einzelnen Region, wie unten in weiß (irgendwo in der oberen linken Region) gezeigt:

enter image description here

Die Position der höchstwahrscheinlichen Region wurde mit gefunden cv2.minMaxLoc() Funktion, die ich dann verwendet habe, um das Rechteck zu zeichnen, um Waldo hervorzuheben:

enter image description here


3
2018-04-11 11:11