Jak znaleźć Waldo z Mathematica?

To mnie męczyło przez weekend: jaki jest dobry sposób na rozwiązanie tych Gdzie jest Waldo? ['poza Ameryką Północną łamigłówki, wykorzystujące Mathematica (przetwarzanie obrazów i inne funkcje)?

Oto, co mam do tej pory, funkcja, która zmniejsza złożoność wizualną trochę przez ściemnianie niektóre nie-czerwone kolory:

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

I przykład adresu URL, gdzie to "działa":

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

(Waldo jest przy kasie rejestr):

Mathematica graphic

Author: Boann, 2011-12-12

5 answers

Znalazłem Waldo!

waldo został znaleziony

Jak to zrobiłem

Po pierwsze, odfiltrowuję wszystkie kolory, które nie są czerwone

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

Następnie obliczam korelację tego obrazu z prostym czarno-białym wzorem, aby znaleźć czerwone i białe przejścia w koszuli.

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

Używam Binarize, aby wybrać piksele na obrazie z wystarczająco wysoką korelacją i narysować wokół nich białe kółko, aby je podkreślić za pomocą Dilation

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

Miałem aby pobawić się trochę z poziomu. Jeśli poziom jest zbyt wysoki, wybiera się zbyt wiele fałszywych alarmów.

W końcu łączę ten wynik z oryginalnym obrazem, aby uzyskać wynik powyżej

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]
 1628
Author: Heike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 19:32:11

Moje przypuszczenie na " kuloodporny sposób, aby to zrobić "(myślę, że CIA znalezienie Waldo na dowolnym zdjęciu satelitarnym w każdej chwili, a nie tylko pojedynczy obraz bez konkurencyjnych elementów, takich jak paski koszulki)... Trenowałbym maszynę Boltzmanna na wielu obrazach Waldo - wszystkie jego odmiany siedzące, stojące, okludowane itp.; koszulka, kapelusz, aparat i wszystkie prace. Nie potrzebujesz dużego korpusu Waldków (może 3-5 wystarczy), ale im więcej tym lepiej.

To przydzieli chmury prawdopodobieństwa do różne elementy występujące w dowolnym prawidłowym układzie, a następnie ustalają (poprzez segmentację), jaka jest średnia wielkość obiektu, fragmentują obraz źródłowy do komórek obiektów, które najbardziej przypominają pojedyncze osoby (biorąc pod uwagę możliwe okluzje i zmiany pozy), ale ponieważ zdjęcia Waldo zazwyczaj zawierają wiele osób w mniej więcej tej samej skali, powinno to być bardzo łatwe zadanie, następnie karmić te segmenty wstępnie przeszkolonej maszyny Boltzmanna. To daje prawdopodobieństwo, że każdy z nich jest Waldo. Weź jedną z największym prawdopodobieństwem.

Tak dzisiaj działa OCR, Czytniki kodów pocztowych i rozpoznawanie pisma bez strokingu. Zasadniczo wiesz, że odpowiedź jest tam, wiesz mniej więcej, Jak to powinno wyglądać, a Wszystko inne może mieć wspólne elementy, ale na pewno jest "nie to", więc nie przejmujesz się "nie to", po prostu patrzysz na Prawdopodobieństwo " to "wśród wszystkich możliwych" to "widziałeś wcześniej" (w kodach pocztowych, na przykład, można trenować BM tylko 1s, tylko 2s, tylko 3s itp., następnie podawaj każdą cyfrę do każdej Maszyny i wybierz taką, która ma największą pewność). Działa to znacznie lepiej niż pojedyncza sieć neuronowa ucząca się wszystkich liczb.

 140
Author: Gregory Klopper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 21:23:40

Zgadzam się z @ GregoryKlopper, że właściwym sposobem rozwiązania ogólnego problemu znalezienia Waldo (lub dowolnego przedmiotu zainteresowania) w dowolnym obrazie byłoby przeszkolenie nadzorowanego klasyfikatora uczenia maszynowego. Korzystając z wielu pozytywnych i negatywnych przykładów, algorytm taki jak Maszyna wektorowa wsparcia, W celu osiągnięcia wysokiej dokładności w tym problemie można prawdopodobnie wytrenować maszynę Boltzmanna (ang. boosted Decision Stump) lub maszynę Boltzmanna (ang. Boltzmann Machine). Mathematica zawiera nawet te algorytmy w swojej Ramy Uczenia Maszynowego .

Dwa wyzwania ze szkoleniem klasyfikatora Waldo to:

  1. określenie właściwego przekształcenia funkcji obrazu. W tym miejscu przydałaby się odpowiedź @Heike: filtr czerwony i detektor wzoru (np. rozkład fal lub DCT) byłby dobrym sposobem na przekształcenie pikseli raw w format, z którego algorytm klasyfikacyjny mógłby się uczyć. Dekompozycja oparta na blokach, która ocenia wszystkie podrozdziały obrazu, byłaby również wymagane ... ale jest to łatwiejsze przez fakt, że Waldo jest a) zawsze w przybliżeniu tego samego rozmiaru i b) zawsze obecny dokładnie raz na każdym obrazie.
  2. uzyskanie wystarczającej ilości przykładów szkoleniowych. Maszyny SVM działają najlepiej z co najmniej 100 przykładami każdej klasy. Komercyjne zastosowania boostingu (np. skupianie twarzy w aparatach cyfrowych) są szkolone na milionach pozytywnych i negatywnych przykładów.

Szybki Google image search wyświetla dobre dane -- Mam zamiar spróbować na zbieranie przykładów szkoleń i kodowanie tego teraz!

Jednak nawet podejście do uczenia maszynowego (lub podejście oparte na regułach sugerowane przez @iND) będzie walczyć o obraz podobny do Land Of Waldos!

 46
Author: lubar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-01 01:23:58

Nie znam się na matematyce . . . szkoda. Ale najbardziej podoba mi się powyższa odpowiedź.

Nadal istnieje poważna wada polegania na samych paskach , aby zebrać odpowiedź(osobiście nie mam problemu z jedną ręczną regulacją). Istnieje przykład (wymieniony przez Bretta Championa, tutaj), który pokazuje, że czasami rozbijają wzór koszuli. Więc wtedy staje się bardziej skomplikowany wzór.

Spróbowałbym podejść do kształtu id i kolory, wraz z relacjami przestrzennymi. Podobnie jak rozpoznawanie twarzy, można szukać wzorów geometrycznych w określonych proporcjach od siebie. Zastrzeżenie jest to, że zwykle jeden lub więcej z tych kształtów jest okludowany.

Uzyskaj balans bieli na obrazie, a czerwony balans czerwieni na obrazie. Uważam, że Waldo ma zawsze tę samą wartość/odcień, ale obraz może być ze skanu lub złej kopii. Następnie zawsze odnoszą się do tablicy kolorów, które Waldo rzeczywiście jest: czerwony, biały, ciemnobrązowy, niebieski, brzoskwiniowy, {kolor buta}.

Istnieje wzór koszuli, a także spodnie, okulary, włosy, twarz, Buty i kapelusz, które definiują Waldo. Ponadto, w stosunku do innych osób na obrazie, Waldo jest po chudej stronie.

Więc znajdź przypadkowych ludzi, aby uzyskać wzrost ludzi na tym zdjęciu. Zmierz średnią wysokość kilku rzeczy w losowych punktach na obrazie (prosty kontur wytworzy sporo pojedynczych osób). Jeśli każda rzecz nie mieści się w jakimś standardowym odchyleniu od każdego inne, na razie są ignorowane. Porównaj średnią wysokość z wysokością obrazu. Jeśli stosunek jest zbyt duży (np. 1: 2, 1: 4 lub podobnie blisko), spróbuj ponownie. Run it 10 (?) razy, aby upewnić się, że próbki są bardzo blisko siebie, z wyłączeniem każdej średniej, która jest poza pewnym odchyleniem standardowym. Możliwe w matematyce?

To twój rozmiar Waldo. Walso jest chudy, więc szukasz czegoś 5: 1 lub 6:1 (lub cokolwiek) ht:wd. Nie jest to jednak wystarczające. Jeśli Waldo jest częściowo ukryty, wysokość może się zmienić. Więc szukasz bloku czerwono-białego, który ~2: 1. Ale musi być więcej wskaźników.

    Waldo ma okulary. Szukaj dwóch kółek 0,5: 1 nad czerwono-białym.
  1. niebieskie spodnie. Dowolna ilość niebieskiego na tej samej szerokości w dowolnej odległości między końcem czerwono-białym i odległości do jego stóp. Zauważ, że nosi krótką koszulę, więc stopy nie są zbyt blisko.
  2. kapelusz. Czerwony-biały dowolny dystans nawet dwa razy większy od czubka głowy. Zauważ, że musi mieć ciemne włosy poniżej i prawdopodobnie okulary.
  3. Długie rękawy. czerwono-biały pod pewnym kątem od głównego czerwono-biały.
  4. ciemne włosy.
  5. kolor buta. Nie znam koloru.

Każdy z nich może mieć zastosowanie. Są to również negatywne kontrole w stosunku do podobnych osób na zdjęciu - np. #2 neguje noszenie czerwono-białego fartucha (zbyt blisko butów), # 5 eliminuje jasne włosy. Również kształt jest tylko jednym wskaźnikiem dla każdy z tych testów . . . sam kolor w określonej odległości może dać dobre wyniki.

To zawęzi obszary do przetworzenia.

Przechowywanie tych wyników da zbiór obszarów, które powinny mieć w sobie Waldo. Wyklucz wszystkie inne obszary (np. dla każdego obszaru wybierz okrąg dwa razy większy niż przeciętny rozmiar osoby), a następnie uruchom proces, który @Heike rozplanował, usuwając wszystkie oprócz czerwonego i tak dalej.

Wszelkie przemyślenia jak kodować to?


Edit:

Przemyślenia jak to zakodować . . . wyklucz wszystkie obszary poza Waldo red, skeletonizuj czerwone obszary i przycinaj je do jednego punktu. Zrób to samo dla Waldo hair brown, Waldo pants blue, Waldo shoe color. W przypadku koloru skóry Waldo wyklucz, a następnie znajdź kontur.

Następnie wyklucz nie-Czerwony, rozszerz (dużo) wszystkie czerwone obszary, a następnie szkieletonize i przyciąć. Ta część da listę możliwych punktów Waldo center. To będzie znacznik do porównania wszystkie inne sekcje Waldo color do.

Stąd, używając szkieletowych obszarów czerwonych (nie rozszerzonych), policz linie w każdym obszarze. Jeśli jest poprawna liczba (cztery, prawda?), jest to z pewnością możliwy obszar. Jeśli nie, to chyba po prostu go wyklucz (jako centrum Waldo . . . to może być nadal jego kapelusz).

Następnie sprawdź, czy powyżej znajduje się kształt twarzy, punkt włosów powyżej, punkt spodni poniżej, punkt butów poniżej i tak dalej.

Nie ma jeszcze kodu -- wciąż czytam dokumenty.

 40
Author: iND,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 00:22:12

Mam szybkie rozwiązanie dla znalezienia Waldo za pomocą OpenCV.

Użyłem funkcji pasującej do szablonu dostępnej w OpenCV, aby znaleźć Waldo.

Aby to zrobić, potrzebny jest szablon. Więc przyciąłem Waldo z oryginalnego obrazu i użyłem go jako szablonu.

Tutaj wpisz opis obrazka

Następnie wywołałem funkcję cv2.matchTemplate() wraz z znormalizowanym współczynnikiem korelacji jako zastosowaną metodę. Zwrócił wysokie prawdopodobieństwo w jednym regionie, jak pokazano w kolorze białym poniżej (gdzieś w lewym górnym rogu):

Tutaj wpisz opis obrazka

Pozycja najwyższego prawdopodobnego obszaru została znaleziona za pomocą funkcji cv2.minMaxLoc(), którą następnie użyłem do narysowania prostokąta, aby wyróżnić Waldo:

Tutaj wpisz opis obrazka

 3
Author: Jeru Luke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-21 21:12:37