Come trovo Waldo con Mathematica?


1542

Questo mi ha infastidito durante il fine settimana: qual è un buon modo per risolvere chi è Waldo? [ Puzzle "Wally" al di fuori del Nord America], usando Mathematica (elaborazione delle immagini e altre funzionalità)?

Ecco quello che ho finora, una funzione che riduce un po 'la complessità visiva attenuando alcuni dei colori non rossi:

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

E un esempio di un URL in cui "funziona":

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

(Waldo è dal registratore di cassa):

Immagine originale

Grafica Mathematica


31
@yoda - in alto a sinistra, tavolo con molte scarpe, un registratore di cassa e Waldo vicino all'angolo del tavolo.
Arnoud Buzing,

8
Come studente di dottorato in visione artificiale sono talmente tentato di fare un tentativo ... ma devo resistere. Per quello che vale, sceglierei Istogramma dei gradienti orientati + finestra scorrevole SVM, come in questo lavoro molto influente (attenzione: pdf).
dimatura

54
"Dov'è Wally ." >. <
Razze di leggerezza in orbita

2
Possiamo cambiare la domanda per supportare anche altre lingue? Ho pensato di farlo con Matlab
Andrey Rubshtein il

2
@ArnoudBuzing: Nella tua domanda, potresti trovare Waldo guardando la selezione che contiene più bianco. : /
Tamara Wijsman

Risposte:


1640

Ho trovato Waldo!

Waldo era stato trovato

Come l'ho fatto

Innanzitutto, sto filtrando tutti i colori che non sono rossi

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

Quindi, sto calcolando la correlazione di questa immagine con un semplice motivo in bianco e nero per trovare le transizioni rosse e bianche nella maglietta.

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

Uso Binarizeper selezionare i pixel nell'immagine con una correlazione sufficientemente elevata e disegnare un cerchio bianco attorno a loro per enfatizzarli usandoDilation

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

Ho dovuto giocare un po 'con il livello. Se il livello è troppo alto, vengono individuati troppi falsi positivi.

Finalmente sto combinando questo risultato con l'immagine originale per ottenere il risultato sopra

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

52
@MikeBantegui Sebbene la soluzione di Heike sia fantastica, non sarei così veloce da impacchettarla in una WhereIsWaldofunzione, in quanto non è una soluzione generale. La stessa Heike ha sottolineato che i livelli devono essere giocati prima che tu possa ottenere un risultato positivo. Per capire cosa intendo, prova la tua funzione di pacchetto così com'è "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"È più difficile con questo.
abcd,

17
Questa immagine è più complicata: Waldo . Penso, tuttavia, che avere qualcosa che possa evidenziare il potenziale Waldos sia ancora utile (per alcune definizioni di "utile"). (Questo mi ricorda alcune delle cose che iPhoto a volte identificherà come un volto nella nostra raccolta di foto ...)
Brett Champion,

33
Si prega di consultare questo Meta post: meta.stackexchange.com/questions/116401/…
Bill the Lizard,

155
Sembra che tu abbia frainteso le regole di Where's Waldo. Questo è chiaramente barare.
Stefan Kendall,

91
Anche se questo è un bel trucco, non funziona. Richiede la sintonizzazione manuale e funziona solo su un'immagine. Non capisco perché sia ​​stato votato e persino scelto come risposta. Scoraggia chiunque non provi nemmeno a rispondere con metodi di lavoro migliori.
Sam Hocevar,

144

La mia ipotesi su un "modo antiproiettile per farlo" (penso che la CIA trovi Waldo in qualsiasi immagine satellitare in qualsiasi momento, non solo una singola immagine senza elementi concorrenti, come camicie a strisce) ... Formerei una macchina Boltzmann su molte immagini di Waldo - tutte le varianti di lui seduto, in piedi, occluso, ecc .; camicia, cappello, macchina fotografica e tutte le opere. Non hai bisogno di un grande corpus di Waldos (forse 3-5 saranno sufficienti), ma più è meglio.

Ciò assegnerà nuvole di probabilità a vari elementi che si verificano in qualunque sia la disposizione corretta, e quindi stabilirà (tramite segmentazione) qual è la dimensione media di un oggetto, frammenterà l'immagine sorgente in celle di oggetti che assomigliano maggiormente a singole persone (considerando possibili occlusioni e comportano cambiamenti ), ma poiché le immagini di Waldo di solito includono MOLTE persone alla stessa scala, questo dovrebbe essere un compito molto semplice, quindi alimentare questi segmenti della macchina Boltzmann pre-allenata. Ti darà probabilità che ognuno sia Waldo. Prendi uno con la massima probabilità.

Ecco come funzionano oggi l'OCR, i lettori di codici postali e il riconoscimento della scrittura senza segni. Fondamentalmente sai che la risposta è lì, sai più o meno come dovrebbe essere, e tutto il resto potrebbe avere elementi comuni, ma è sicuramente "non", quindi non ti preoccupi del "non", tu basta guardare la probabilità di "esso" tra tutti i possibili "è" che hai visto prima "(ad esempio nei codici postali, ti alleneresti BM per solo 1 secondo, solo 2 secondi, solo 3 secondi, ecc., poi dai da mangiare a ciascuno digita su ogni macchina e scegline una che abbia la massima sicurezza. Funziona molto meglio di una singola rete neurale con funzioni di apprendimento di tutti i numeri.


13
Non sono sufficienti le semplici reti neurali? Inoltre, l'articolo di Wikipedia afferma che le macchine Boltzmann non sono pratiche.
GClaramunt,

2
Senza provare non ne sono sicuro, ma se una rete neurale abbastanza grande e complessa dovrebbe essere sufficiente per QUALCOSA. Soprattutto con le ricorrenze. Le macchine Boltzmann fanno MOLTO MOLTO MOLTO bene per riconoscere un insieme abbastanza semplice di dati con un'elevata quantità di rumore in un mare di dati a differenza di se stesso.
Gregory Klopper,

14
I codici postali vengono letti sempre con le macchine Boltzmann e l'accuratezza della consegna della posta ha superato il tetto.
Gregory Klopper,

47

Sono d'accordo con @GregoryKlopper che il modo giusto per risolvere il problema generale di trovare Waldo (o qualsiasi oggetto di interesse) in un'immagine arbitraria sarebbe quello di formare un classificatore supervisionato di machine learning. Utilizzando molti esempi positivi e negativi, un algoritmo come Support Vector Machine , Boosted Decision Stump o Boltzmann Machine potrebbe probabilmente essere addestrato per ottenere un'elevata precisione su questo problema. Mathematica include anche questi algoritmi nel suo Machine Learning Framework .

Le due sfide con l'addestramento di un classificatore Waldo sarebbero:

  1. Determinare la corretta trasformazione della funzione immagine. È qui che la risposta di @ Heike sarebbe utile: un filtro rosso e un rivelatore di pattern spogliato (ad esempio, decomposizione wavelet o DCT) sarebbero un buon modo per trasformare i pixel grezzi in un formato da cui l'algoritmo di classificazione potrebbe imparare. Sarebbe inoltre necessaria una decomposizione basata su blocchi che valuti tutte le sottosezioni dell'immagine ... ma ciò è reso più semplice dal fatto che Waldo è a) sempre approssimativamente delle stesse dimensioni eb) sempre presente esattamente una volta in ogni immagine.
  2. Ottenere abbastanza esempi di formazione. Le SVM funzionano meglio con almeno 100 esempi di ogni classe. Le applicazioni commerciali di potenziamento (ad es. La messa a fuoco del viso nelle fotocamere digitali) sono formate su milioni di esempi positivi e negativi.

Una rapida ricerca di immagini di Google rivela alcuni dati positivi: proverò a raccogliere alcuni esempi di formazione e a codificarli adesso!

Tuttavia, anche un approccio di apprendimento automatico (o l'approccio basato su regole suggerito da @iND) lotterà per un'immagine come la Terra di Waldos !


Un sistema di visione artificiale basato sull'apprendimento automatico che tenta di risolvere il problema "Where's Waldo" nel mondo reale (ovvero trovare una persona in particolare in foto di folla su Flickr) è stato presentato alla conferenza Computer Vision e Pattern Recognition lo scorso anno. Truffano un po 'però aggiungendo alcune informazioni sulla posizione 3D usando più foto della stessa scena.
lubar

41

Non conosco Mathematica. . . peccato. Ma mi piace la risposta sopra, per la maggior parte.

Ancora c'è un difetto principale basandosi sulle strisce solo per raccogliere la risposta (io personalmente non ho un problema con una regolazione manuale). C'è un esempio (elencato da Brett Champion, qui ) presentato che mostra che, a volte, rompono il modello della camicia. Quindi diventa uno schema più complesso.

Proverei un approccio di forma id e colori, insieme a relazioni spaziali. Proprio come il riconoscimento facciale, potresti cercare motivi geometrici a determinati rapporti l'uno dall'altro. L'avvertenza è che di solito una o più di quelle forme sono occluse.

Ottieni un bilanciamento del bianco sull'immagine e rosso un bilanciamento del rosso dall'immagine. Credo che Waldo abbia sempre lo stesso valore / tonalità, ma l'immagine potrebbe provenire da una scansione o da una cattiva copia. Quindi fai sempre riferimento a una gamma di colori che Waldo è in realtà: rosso, bianco, marrone scuro, blu, pesca, {colore scarpa}.

C'è un modello di camicia e anche pantaloni, occhiali, capelli, viso, scarpe e cappello che definiscono Waldo. Inoltre, rispetto ad altre persone nell'immagine, Waldo è dalla parte magra.

Quindi, trova persone a caso per ottenere l'altezza delle persone in questa immagine. Misura l'altezza media di un mucchio di cose in punti casuali nell'immagine (un semplice contorno produrrà un bel po 'di persone). Se ogni cosa non rientra in una deviazione standard l'una dall'altra, per ora vengono ignorate. Confronta la media delle altezze con l'altezza dell'immagine. Se il rapporto è troppo elevato (ad es. 1: 2, 1: 4 o similmente vicino), riprovare. Eseguire 10 (?) Volte per assicurarsi che i campioni siano tutti abbastanza vicini tra loro, escludendo qualsiasi media al di fuori di una deviazione standard. Possibile in Mathematica?

Questa è la tua taglia Waldo. Walso è magro, quindi stai cercando qualcosa di 5: 1 o 6: 1 (o qualsiasi altra cosa) ht: wd. Tuttavia, questo non è sufficiente. Se Waldo è parzialmente nascosto, l'altezza potrebbe cambiare. Quindi, stai cercando un blocco di rosso-bianco che ~ 2: 1. Ma ci devono essere più indicatori.

  1. Waldo ha gli occhiali. Cerca due cerchi 0,5: 1 sopra il rosso-bianco.
  2. Pantaloni blu. Qualsiasi quantità di blu alla stessa larghezza a qualsiasi distanza tra l'estremità del rosso-bianco e la distanza dai suoi piedi. Nota che indossa la camicia corta, quindi i piedi non sono troppo vicini.
  3. Il cappello. Rosso-bianco qualsiasi distanza fino a due volte la parte superiore della sua testa. Nota che deve avere i capelli scuri sotto, e probabilmente gli occhiali.
  4. Maniche lunghe. rosso-bianco ad un certo angolo rispetto al rosso-bianco principale.
  5. Capelli scuri.
  6. Colore della scarpa. Non conosco il colore.

Ognuno di quelli potrebbe applicarsi. Questi sono anche controlli negativi contro persone simili nella foto - ad esempio, # 2 nega di indossare un grembiule rosso-bianco (troppo vicino alle scarpe), # 5 elimina i capelli di colore chiaro. Inoltre, la forma è solo un indicatore per ciascuno di questi test. . . il solo colore entro la distanza specificata può dare buoni risultati.

Ciò restringerà le aree da elaborare.

La memorizzazione di questi risultati produrrà una serie di aree che dovrebbero contenere Waldo. Escludere tutte le altre aree (ad esempio, per ciascuna area, selezionare un cerchio grande il doppio della dimensione media della persona), quindi eseguire il processo che @Heike ha disposto rimuovendo tutto tranne il rosso, e così via.

Qualche idea su come codificare questo?


Modificare:

Pensieri su come codificare questo. . . escludi tutte le aree tranne Waldo in rosso, scheletri le aree rosse e potale in un unico punto. Fare lo stesso per Waldo capelli castani, pantaloni Waldo blu, colore scarpe Waldo. Per il colore della pelle Waldo, escludi, quindi trova il contorno.

Quindi, escludere non rosso, dilatare (molto) tutte le aree rosse, quindi scheletrare e potare. Questa parte fornirà un elenco di possibili punti centrali di Waldo. Questo sarà il marker per confrontare tutte le altre sezioni di colore di Waldo.

Da qui, usando le aree rosse scheletrate (non quelle dilatate), conta le linee in ciascuna area. Se c'è il numero corretto (quattro, giusto?), Questa è sicuramente una possibile area. Altrimenti, suppongo che lo escluda (in quanto centro Waldo ... potrebbe essere ancora il suo cappello).

Quindi controlla se c'è una forma del viso sopra, una punta di capelli sopra, i pantaloni puntano sotto, le scarpe sotto e così via.

Nessun codice ancora - ancora leggendo i documenti.


8
Forse puoi mostrare una prova di concetto in qualunque sistema / linguaggio tu abbia familiarità. Questo ti darà anche un'idea di dove potrebbero sorgere le difficoltà.
Szabolcs,

1
Oh, mi sto solo godendo la sfida così com'è. Mi dà qualcosa da fare tra passeggiate sulla spiaggia e vestirsi per la cena.
iND

1
Così. . . perché i downvotes? In che modo differisce dall'altra risposta speculativa qui? È un suggerimento che questa domanda dovrebbe essere presa più seriamente? O semplicemente che dovrei sembrare più serio nelle mie indagini? Il mio approccio è davvero sbagliato?
iND

3
Non ti ho votato in negativo e non credo che i downgrade siano appropriati per tentativi onesti di rispondere (a meno che non forniscano disinformazione). La ragione più probabile dei downvotes è che non sembra che tu abbia provato l'approccio (dal suono piuttosto complicato), e trovare una buona soluzione probabilmente richiederebbe una buona quantità di sperimentazione pratica ed escludere molte idee. L'altra risposta speculativa suggerisce un metodo generale (come punto di partenza) che è stato usato in passato per problemi simili, e c'è una buona quantità di letteratura su di esso. Sto solo cercando di spiegare cosa è successo.
Szabolcs,

Grazie per la spiegazione. Immagino di non concentrarmi sulla storia delle idee.
iND

2

Ho una soluzione rapida per trovare Waldo usando OpenCV.

Ho usato la funzione di corrispondenza dei modelli disponibile in OpenCV per trovare Waldo.

Per fare questo è necessario un modello. Quindi ho ritagliato Waldo dall'immagine originale e l'ho usato come modello.

inserisci qui la descrizione dell'immagine

Successivamente ho chiamato la cv2.matchTemplate()funzione insieme al coefficiente di correlazione normalizzato come metodo utilizzato. Restituiva un'alta probabilità in una singola regione come mostrato in bianco sotto (da qualche parte nella regione in alto a sinistra):

inserisci qui la descrizione dell'immagine

La posizione della regione più alta probabile è stata trovata usando la cv2.minMaxLoc()funzione, che ho quindi usato per disegnare il rettangolo per evidenziare Waldo:

inserisci qui la descrizione dell'immagine


7
Stai cercando di affrontare le più famose domande sull'elaborazione delle immagini di SO? ;) La tua soluzione è facile e facile ma a / funziona solo per questa specifica immagine e b / ha bisogno dell'immagine esatta di Waldo che vuoi trovare in anticipo, mentre penso che la domanda riguardasse la ricerca di qualsiasi Waldo in qualsiasi "Dov'è l'immagine di Waldo" come giocheresti al gioco normale: senza sapere prima che aspetto ha. Questa domanda è comunque molto divertente
Soltius l'

@Solitus ha esattamente !!! L'ho lavorato solo per questa immagine in particolare. Lavorare per immagini diverse sarebbe una sfida !!
Jeru Luke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.