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):
5 answers
Znalazłem Waldo!
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]]
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.
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:
- 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.
- 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!
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.
- 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.
- 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.
- Długie rękawy. czerwono-biały pod pewnym kątem od głównego czerwono-biały.
- ciemne włosy.
- 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.
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.
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):
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:
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