Das nervte mich über das Wochenende: Was ist ein guter Weg, um diese zu lösen ? Wo ist Waldo? [ 'Wally' außerhalb Nordamerikas] Rätsel mit Mathematica (Bildverarbeitung und andere Funktionen)?
Folgendes habe ich bisher: Eine Funktion, die die visuelle Komplexität ein wenig reduziert, indem einige der nicht roten Farben gedimmt werden:
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, bei der dies funktioniert:
whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]
(Waldo ist an der Kasse):
image-processing
wolfram-mathematica
Arnoud Buzing
quelle
quelle
Antworten:
Ich habe Waldo gefunden!
Wie ich es gemacht habe
Zuerst filtere ich alle Farben heraus, die nicht rot sind
Als nächstes berechne ich die Korrelation dieses Bildes mit einem einfachen Schwarz-Weiß-Muster, um die Rot-Weiß-Übergänge im Hemd zu finden.
Ich benutze es
Binarize
, um die Pixel im Bild mit einer ausreichend hohen Korrelation auszuwählen und einen weißen Kreis um sie zu zeichnen, um sie mit hervorzuhebenDilation
Ich musste ein wenig mit dem Level herumspielen. Wenn der Pegel zu hoch ist, werden zu viele Fehlalarme ausgewählt.
Schließlich kombiniere ich dieses Ergebnis mit dem Originalbild, um das obige Ergebnis zu erhalten
quelle
WhereIsWaldo
Funktion packen , da es sich nicht um eine allgemeine Lösung handelt. Heike selbst hat darauf hingewiesen, dass die Levels herumgespielt werden müssen, bevor Sie ein positives Ergebnis erzielen können. Um zu sehen, was ich meine, probieren Sie Ihre verpackte Funktion so aus, wie sie ist."http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"
Mit dieser Funktion ist es schwieriger.Meine Vermutung über einen "kugelsicheren Weg, dies zu tun" (denken Sie, die CIA findet Waldo jederzeit in jedem Satellitenbild, nicht nur in einem einzigen Bild ohne konkurrierende Elemente wie gestreifte Hemden) ... Ich würde eine Boltzmann-Maschine auf vielen Bildern von Waldo trainieren - alle Variationen von ihm sitzen, stehen, verschlossen usw.; Hemd, Hut, Kamera und alle Arbeiten. Sie brauchen kein großes Korpus Waldos (vielleicht reichen 3-5), aber je mehr desto besser.
Dadurch werden Wahrscheinlichkeiten verschiedenen Elementen zugeordnet, die in der richtigen Anordnung auftreten, und dann (über Segmentierung) die durchschnittliche Objektgröße ermittelt. Das Quellbild wird in Zellen von Objekten fragmentiert, die einzelnen Personen am ähnlichsten sind (unter Berücksichtigung möglicher Okklusionen und Posenänderungen) ), aber da Waldo-Bilder normalerweise eine Menge Leute in ungefähr demselben Maßstab enthalten, sollte dies eine sehr einfache Aufgabe sein und dann diese Segmente der vorgeübten Boltzmann-Maschine füttern. Es gibt Ihnen die Wahrscheinlichkeit, dass jeder Waldo ist. Nehmen Sie eine mit der höchsten Wahrscheinlichkeit.
So funktionieren OCR, Postleitzahlleser und streichellose Handschrifterkennung heute. Grundsätzlich wissen Sie, dass die Antwort da ist, Sie wissen mehr oder weniger, wie sie aussehen sollte, und alles andere mag gemeinsame Elemente haben, ist aber definitiv "nicht es", also kümmern Sie sich nicht um das "nicht es", Sie Schauen Sie sich nur die Wahrscheinlichkeit von "es" unter allen möglichen "es" an, die Sie zuvor gesehen haben "an (in Postleitzahlen würden Sie beispielsweise BM nur für 1s, nur 2s, nur 3s usw. trainieren und dann jeweils füttern Dies funktioniert viel besser als die Lernfunktionen eines einzelnen neuronalen Netzwerks aller Zahlen.
quelle
Ich stimme @GregoryKlopper zu, dass der richtige Weg, um das allgemeine Problem zu lösen, Waldo (oder ein Objekt von Interesse) in einem beliebigen Bild zu finden, darin besteht, einen überwachten Klassifikator für maschinelles Lernen zu trainieren. Anhand vieler positiv und negativ gekennzeichneter Beispiele könnte ein Algorithmus wie Support Vector Machine , Boosted Decision Stump oder Boltzmann Machine wahrscheinlich trainiert werden, um bei diesem Problem eine hohe Genauigkeit zu erzielen. Mathematica nimmt diese Algorithmen sogar in sein Machine Learning Framework auf .
Die zwei Herausforderungen beim Training eines Waldo-Klassifikators wären:
Eine schnelle Google-Bildsuche liefert einige gute Daten - ich werde versuchen, einige Trainingsbeispiele zu sammeln und diese jetzt zu codieren!
Aber selbst ein Ansatz des maschinellen Lernens (oder der von @iND vorgeschlagene regelbasierte Ansatz) wird um ein Bild wie das Land Waldos kämpfen !
quelle
Ich kenne Mathematica nicht. . . schade. Aber die obige Antwort gefällt mir größtenteils.
Dennoch gibt in Berufung auf den Streifen ein großer Fehler ist allein aufzulesen die Antwort (Ich persönlich habe kein Problem mit einer manuellen Einstellung). Es ist ein Beispiel (aufgeführt von Brett - Meister, hier ) vorgestellt , die zeigen , dass sie in Zeiten, das Hemd Muster aufzubrechen. Dann wird es ein komplexeres Muster.
Ich würde einen Ansatz von Form-ID und Farben zusammen mit räumlichen Beziehungen versuchen. Ähnlich wie bei der Gesichtserkennung können Sie nach geometrischen Mustern in bestimmten Verhältnissen suchen. Die Einschränkung ist, dass normalerweise eine oder mehrere dieser Formen verdeckt sind.
Holen Sie sich einen Weißabgleich auf dem Bild und einen Rotabgleich auf dem Bild. Ich glaube, Waldo hat immer den gleichen Wert / Farbton, aber das Bild stammt möglicherweise von einem Scan oder einer schlechten Kopie. Beziehen Sie sich dann immer auf eine Reihe der Farben, die Waldo tatsächlich hat: Rot, Weiß, Dunkelbraun, Blau, Pfirsich, {Schuhfarbe}.
Es gibt ein Hemdmuster und auch die Hosen, Brillen, Haare, das Gesicht, die Schuhe und den Hut, die Waldo definieren. Außerdem ist Waldo im Vergleich zu anderen Personen auf dem Bild eher dünn.
Finden Sie also zufällige Personen, um die Größe der Personen in diesem Bild zu ermitteln. Messen Sie die durchschnittliche Höhe einer Reihe von Dingen an zufälligen Punkten im Bild (ein einfacher Umriss erzeugt einige einzelne Personen). Wenn jedes Ding nicht innerhalb einer Standardabweichung voneinander liegt, werden sie vorerst ignoriert. Vergleichen Sie den Durchschnitt der Höhen mit der Höhe des Bildes. Wenn das Verhältnis zu groß ist (z. B. 1: 2, 1: 4 oder ähnlich nahe), versuchen Sie es erneut. Führen Sie es 10 (?) Mal durch, um sicherzustellen, dass alle Stichproben ziemlich nahe beieinander liegen, mit Ausnahme von Durchschnittswerten, die außerhalb einer Standardabweichung liegen. In Mathematica möglich?
Dies ist Ihre Waldo-Größe. Walso ist dünn, also suchen Sie etwas 5: 1 oder 6: 1 (oder was auch immer) ht: wd. Dies reicht jedoch nicht aus. Wenn Waldo teilweise versteckt ist, kann sich die Höhe ändern. Sie suchen also nach einem rot-weißen Block, der ~ 2: 1 ist. Aber es muss mehr Indikatoren geben.
Jeder von diesen könnte zutreffen. Dies sind auch negative Überprüfungen gegen ähnliche Personen auf dem Bild - z. B. negiert # 2 das Tragen einer rot-weißen Schürze (zu nahe an Schuhen), # 5 eliminiert helles Haar. Außerdem ist die Form nur ein Indikator für jeden dieser Tests. . . Farbe allein innerhalb des angegebenen Abstands kann zu guten Ergebnissen führen.
Dadurch werden die zu verarbeitenden Bereiche eingegrenzt.
Durch das Speichern dieser Ergebnisse wird eine Reihe von Bereichen erstellt, in denen Waldo enthalten sein sollte . Schließen Sie alle anderen Bereiche aus (z. B. wählen Sie für jeden Bereich einen Kreis aus, der doppelt so groß ist wie die durchschnittliche Personengröße), und führen Sie dann den von @Heike festgelegten Prozess aus, indem Sie alle außer Rot entfernen und so weiter.
Irgendwelche Gedanken darüber, wie man das codiert?
Bearbeiten:
Gedanken darüber, wie man das codiert. . . Schließen Sie alle Bereiche außer Waldo-Rot aus, skelettieren Sie die roten Bereiche und beschneiden Sie sie auf einen einzigen Punkt. Machen Sie dasselbe für Waldo Haare braun, Waldo Hosen blau, Waldo Schuhfarbe. Für die Waldo-Hautfarbe ausschließen und dann den Umriss finden.
Als nächstes nicht rot ausschließen, alle roten Bereiche erweitern (viel), dann skelettieren und beschneiden. Dieser Teil enthält eine Liste möglicher Waldo-Mittelpunkte. Dies ist der Marker, mit dem alle anderen Waldo-Farbabschnitte verglichen werden können.
Von hier aus zählen Sie anhand der skelettierten roten Bereiche (nicht der erweiterten) die Linien in jedem Bereich. Wenn es die richtige Zahl gibt (vier, richtig?), Ist dies sicherlich ein möglicher Bereich. Wenn nicht, schließe ich es einfach aus (als Waldo-Zentrum ... es kann immer noch sein Hut sein).
Überprüfen Sie dann, ob oben eine Gesichtsform, oben ein Haarpunkt, unten ein Hosenpunkt, unten ein Schuhpunkt usw. vorhanden ist.
Noch kein Code - liest noch die Dokumente.
quelle
Ich habe eine schnelle Lösung, um Waldo mit OpenCV zu finden.
Ich habe die in OpenCV verfügbare Template-Matching- Funktion verwendet, um Waldo zu finden.
Dazu wird eine Vorlage benötigt. Also habe ich Waldo aus dem Originalbild herausgeschnitten und als Vorlage verwendet.
Als nächstes nannte ich die
cv2.matchTemplate()
Funktion zusammen mit dem normalisierten Korrelationskoeffizienten als verwendete Methode. Es wurde eine hohe Wahrscheinlichkeit für eine einzelne Region zurückgegeben, wie unten in Weiß gezeigt (irgendwo oben links):Die Position des höchstwahrscheinlichen Bereichs wurde mithilfe der
cv2.minMaxLoc()
Funktion ermittelt, mit der ich dann das Rechteck gezeichnet habe, um Waldo hervorzuheben:quelle