2016-06-05 21 views
20

Vorrei catturare il numero da questo tipo di immagine.Come classificare i numeri sfocati con openCV

enter image description here

Ho cercato corrispondenza multi-scala dal seguente link.

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

Tutto quello che voglio sapere è il numero rosso. Ma il problema è che il numero rosso è sfocato per il modello di riconoscimento/corrispondenza openCV. Ci sarebbe un altro modo possibile per rilevare questo numero rosso su sfondo nero?

+0

La multi-scala non aiuta a risolvere l'immagine in modo più chiaro, sfortunatamente. Inoltre, avrai bisogno di riconoscere più font o dare priorità ai caratteri che riconoscerai (come il numero sopra). Dai un'occhiata a [questa domanda correlata] (http://stackoverflow.com/questions/7765810/is-there-a-way-to-detect-if-an-image-is-blurry) – Aaron3468

+0

Ecco alcuni degli ultimi approcci di ricerca: 1) [Riconoscimento numerico a più cifre dalle immagini di Street View utilizzando Deep Neurevision Networks Convolutional] (http://research.google.com/pubs/pub42241.html); 2) [Reading Text in the Wild] (http://www.robots.ox.ac.uk/~vgg/research/text/). La rete neurale convoluzionale profonda è il mattone di base comune per questi approcci. – Jon

risposta

18

Classifying Cifre

È chiarito nei commenti che hai già isolato la parte numero dell'immagine pre-rilevamento, quindi inizierò sotto quel presupposto.

Forse è possibile approssimare gli effetti prospettiva e la "sfocatura" del numero trattandolo come un numero scritto a mano. In questo caso, esiste un famoso set di numeri scritti a mano per l'allenamento di classificazione chiamato mnist.

Yann LeCun ha elencato lo stato dell'arte su questo set di dati qui mnist hand-written dataset.

All'estremità dello spettro, le reti neurali convoluzionali producono outrageously low error rates (frazioni dell'1% di errore). Per una soluzione più semplice, i k-vicini più vicini che utilizzano l'allineamento, la rimozione del rumore, l'offuscamento e lo spostamento di 2 pixel, hanno prodotto un errore di circa l'1% ed è notevolmente più veloce da implementare. Python opencv has an implementation. Anche le reti neurali e le macchine vettoriali di supporto con il raddrizzamento hanno delle prestazioni piuttosto sorprendenti.

Nota che le reti convoluzionali non ti fanno scegliere le tue caratteristiche, quindi le importanti informazioni sul differenziale di colore qui potrebbero essere utilizzate solo per restringere la regione di interesse. Altri approcci, in cui definisci lo spazio delle tue funzionalità, potrebbero incorporare la differenza cromatica nota in modo più preciso.

Python supporta molte tecniche di apprendimento automatico nel fantastico pacchetto sklearn - here are examples of sklearn applied to mnist. Se siete alla ricerca di una spiegazione tutorialized di machine learning in python, sklearn's own tutorial is very verbose

Dal link sklearn: Classifying mnist

Questi sono i tipi di elementi che si sta cercando di classificare se si impara di utilizzare questo approccio. Per sottolineare quanto sia facile per iniziare la formazione alcune di queste macchine classificatori di apprendimento basati su, qui è una sezione ridotta dal codice di esempio nel pacchetto sklearn collegato:

digits = datasets.load_digits() # built-in to sklearn! 
data = digits.images.reshape((len(digits.images), -1)) 

# Create a classifier: a support vector classifier 
classifier = svm.SVC(gamma=0.001) 

# We learn the digits on the first half of the digits 
classifier.fit(data[:n_samples/2], digits.target[:n_samples/2]) 

Se stai sposata a OpenCV (forse perché vuoi portarlo su un sistema in tempo reale in futuro), opencv3/python has a tutorial on this exact topic too! La loro demo utilizza k-closest-neighbor (elencato nella pagina LeCun), ma anche have svms e molti altri strumenti di sklearn.La loro pagina OCR utilizzando SVM utilizza raddrizzamento, che potrebbe essere utile con l'effetto prospettico nel vostro problema:

Deskewed digit


UPDATE: Ho usato l'out-of-the box skimage approccio descritto sopra su la tua immagine, fortemente ritagliata, e lo ha classificato correttamente . Un molto ulteriori test sarebbe necessario per vedere se questo è in pratica rhobust

enter image description here

^^ Quell'immagine piccola è la coltura 8x8 dell'immagine è stato incorporato nella sua interrogazione. mnist è immagini 8x8. Ecco perché si allena in meno di un secondo con argomenti predefiniti in skimage.

ho convertito che il formato corretto scalando fino alla gamma mnist utilizzando

number = scipy.misc.imread("cropped_image.png") 
datum = (number[:,:,0]*15).astype(int).reshape((64,)) 
classifier.predict(datum) # returns 8 

non ho cambiato niente altro dall'esempio; qui, sto solo usando il primo canale per la classificazione e nessun calcolo di funzioni intelligenti. 15 mi è sembrato giusto; sarà necessario sintonizzare per ottenere all'interno della gamma di destinazione o (idealmente) fornire la propria formazione e testing set


Object Detection

Se non è stato isolato il numero nell'immagine avrai bisogno di un rilevatore di oggetti. Lo spazio della letteratura su questo problema è gigantesco e non inizierò a scavare quella tana del coniglio (google Viola e Jones, forse?) This blog copre i fondamenti di un rivelatore a "finestra scorrevole" in python. Ad Adrian Rosebrock sembra che sia anche un contributore su SO, e quella pagina ha alcuni buoni esempi di rivelatori di oggetti basati su python e opencv e abbastanza tutorializzati (in realtà tu hai collegato quel blog alla tua domanda, non me ne sono reso conto).

In breve, classificare le finestre sull'immagine e selezionare la finestra di massima confidenza. Restringendo lo spazio di ricerca con una regione di interesse volontà di rendimento ovviamente enormi miglioramenti in tutte le aree di performance

+0

oh grazie en_Knight. Dato che sono molto nuovo su opencv, potresti gentilmente indirizzarmi ad alcuni tutorial su come utilizzare queste funzionalità di classificazione offerte da python? Il mio tentativo iniziale sarebbe ritagliare l'immagine in modo che appaiano solo lo sfondo nero e le cifre rosse. Quindi esegui il classificatore per identificare la cifra? Sembra legittimo? – spencerJANG

+0

Sembra un ottimo approccio. Se riesci a ritagliare l'immagine, il problema diventa 10.000 volte più divertente; nel mio esempio in cui abbiamo utilizzato il set di dati di cifre incorporate per addestrare un classificatore, ho ritagliato l'immagine attorno al numero e poi l'ho ridimensionato per essere 8x8. è quel collegamento di skimage difficile da seguire? Posso cercare alcune alternative, ci sono certamente un sacco di tutorial di classificazione là fuori –

+0

datum = (numero [:,:, 0] * 15) .astype (int) .reshape ((64,)) ---- --- Non sono sicuro di aver capito questa linea. potresti spiegarmi in dettaglio? Presumo che riduca l'immagine ritagliata a 8x8, ma quando provo ottengo un errore di valore che dice che la dimensione dell'array deve essere invariata. – spencerJANG

2

Hai un paio di cose che si può usare a vostro vantaggio:

  • Il numero è all'interno del nero cornice rettangolare e un colore
  • Il numero sembra essere un display di tipo LCD segmentato, in tal caso ci sono solo un numero finito di segmenti che sono spenti o accesi.

Quindi vi suggerisco:

  • Calibrare la macchina fotografica e pre-elaborazione dell'immagine per rimuovere la distorsione della lente
  • Eliminare il rettangolo di visualizzazione:
    • rilevare il rettangolo di visualizzazione utilizzando l'intersezione di hello linee, o rilevamento dei fronti seguito dal rilevamento dei contorni e quindi scegliere i contorni più grandi e squadrati
    • uso GetPerspectiveTransform per ottenere la trasformazione tra coordinate immagine e un rettangolo ideale, quindi trasformare l'immagine in ingresso utilizzando WarpPerspective
  • Immagine spaccata in R, canali G e B ed elaborerà r - avg(g, b), questa è un'illuminazione po dipendente, ma dovrebbe dare qualcosa di simile:

    cleaned up number image

  • Allora o provare pattern matching su questo, o forse ri-segmentare l'immagine e tentare di trovare quale segmenti del display sono illuminati, o gestito attraverso un o Pacchetto CR.
+0

"Calibrate your camera" quanto funzionerà se non ha i parametri della fotocamera? –

+0

Probabilmente funzionerà senza di esso, può utilizzare il 'GML C++ Camera Calibration Toolbox' o simile se non si conoscono i parametri della telecamera –

Problemi correlati