2014-12-21 14 views
8

Sto tentando di estrarre caratteri alfanumerici (a-z0-9) che non formano parole sensate da un'immagine presa con una fotocamera di consumo (inclusi i telefoni cellulari). I caratteri hanno dimensioni e tipo di carattere uguali e non sono formattati. L'elaborazione effettiva viene eseguita in Windows.Migliora la qualità di rilevamento Tesseract

L'immagine seguente mostra l'ingresso grezzo: Original image

Dopo trasformazione prospettica applico quanto segue con OpenCV:

  • Convertire da RGB a grigio
  • Applicare cv::medianBlur per rimuovere il rumore
  • Converti l'immagine in binario usando la soglia adattativa cv::adaptiveThreshold
  • Conosco il numero di righe e colonne della griglia. Quindi estraggo semplicemente ogni cella della griglia usando questa informazione.

Dopo tutti questi passaggi che ricevo immagini che sembrano simili a queste:

enter image description here

enter image description here

enter image description here

Poi corro Tesseract (ultima versione SVN con le più recenti dati di allenamento) su ogni immagine di cella estratta singolarmente (ho provato diversi -psm e -l valori):

tesseract.exe -l eng -psm 11 sample.png outtext 

i risultati prodotti da Tesseract non sono molto buone:

  • maggior parte dei caratteri non vengono riconosciuti.
  • Le linee della griglia vengono talvolta interpretate come caratteri "l" o "i".

ho già sperimentato con operazioni morfologiche (aperto, chiudere, erodere, dilatare) e lo ha sostituito con soglia adattativa OTSU thresholding (THRESH_OTSU), ma i risultati peggiorata.

Cos'altro posso provare a migliorare la qualità del riconoscimento? Oppure esiste anche un metodo migliore per estrarre i caratteri, oltre all'utilizzo di tesseract (ad esempio la corrispondenza dei modelli?)?

Edit (21-12-2014): ho provato corrispondenza semplice modello (utilizzando normalizzata correlazione incrociata e LMS, ma con risultati ancora peggiori). Ma ho fatto un enorme passo in avanti estraendo ogni personaggio usando findCountours e poi eseguendo tesseract con un solo carattere e l'opzione -psm 10 che interpreta ogni immagine di input come un singolo carattere. Addizionalmente rimuovo i caratteri non alfanumerici in una fase di post-elaborazione. I primi risultati sono incoraggianti con percentuali di rilevamento del 90% e migliori. Il problema principale è il rilevamento errato di caratteri "9" e "g" e "q".

saluti,

risposta

1

Come ho detto here, si può dire tesseract di prestare attenzione su personaggi "quasi stesse". Inoltre, ci sono alcune opzioni in tesseract che non ti aiutano nel tuo esempio. Ad esempio, un "Pocahonta5S" diventerà, il più delle volte, un "PocahontaSS" perché il numero è in una lettera. Puoi vedere in questo modo così.

Per quanto riguarda la pre-elaborazione, è necessario utilizzare un filtro di messa a fuoco. Non dimenticare che tesseract applicherà sempre il filtro di Otsu prima di leggere qualsiasi cosa. Se si desidera ottenere un buon risultato, la nitidezza + Soglia adattiva con altri filtri sono buone idee.

1

Si consiglia di utilizzare OpenCV in combinazione con tesseract.

Il problema nelle immagini di input per tesseract sono le regioni non di carattere nell'immagine.

un approccio me

per sbarazzarsi di questi vorrei utilizzare la funzione OpenCV findContour di ricevere tutti i contorni nell'immagine binaria. Successivamente definire alcuni criteri per illiminare le regioni non carattere. Ad esempio, prendi solo le regioni, che sono all'interno dell'immagine e non toccano il bordo, o prendi solo le regioni con un'area geografica specifica o un rapporto specifico di altezza in larghezza. Trova alcuni tipi di funzionalità che ti consentono di distinguere tra i caratteri e i contorni non di caratteri. Successivamente eliminare queste regioni non di caratteri e gestire le immagini in avanti per tesseract.

Proprio come idea per la prova generale di questo approccio:

Eliminare la regioni non manualità (gimp o vernice, ...) e dare l'immagine da tesseract. Se il risultato si adatta alle tue esecuzioni, puoi provare ad eliminare le regioni non di carattere con il metodo proposto sopra.