2012-07-25 13 views
21

Sto lavorando a un progetto che comporta l'estrazione di documenti scientifici di testo archiviati in formato PDF. Per la maggior parte dei documenti, questo si ottiene facilmente usando PDFMiner, ma alcuni vecchi documenti memorizzano il loro testo come immagini grandi. In sostanza, una carta viene scansionata e quel file di immagine (in genere PNG o JPEG) comprende l'intera pagina.Miglioramento delle prestazioni OCR nelle scansioni multi-paragrafo

Ho provato a utilizzare il motore Tesseract tramite le associazioni python-tesseract, ma i risultati sono piuttosto deludenti.

Prima di immergermi nelle domande che ho con questa libreria, vorrei menzionare che sono aperto a suggerimenti per le librerie OCR. Sembrano esserci poche soluzioni Python native.

Here è una di queste immagini (JPEG) su cui sto cercando di estrarre testo. Ho il codice esatto fornito nei frammenti di esempio sulla pagina di codice google python-tesseract che ho collegato sopra. Devo dire che la documentazione è un po 'scarsa, quindi è abbastanza probabile che una delle molte opzioni nel mio codice non sia configurata correttamente. Qualsiasi consiglio (o link a tutorial approfonditi) sarebbe molto apprezzato.

Here è l'output dal mio tentativo di OCR.

Le mie domande sono le seguenti:

  1. C'è qualcosa non ottimale nel codice che sto utilizzando? C'è un modo migliore per farlo? Una biblioteca diversa forse?
  2. Che tipo di preelaborazione posso eseguire per migliorare il rilevamento? Le immagini sono tutte B & W, ma dovrei forse impostare una soglia e impostare qualcosa sopra ad un colore nero a valore singolo e tutto ciò che si trova sotto ad un colore bianco a valore nullo? Qualunque altra cosa?
  3. Una domanda più specifica: è possibile migliorare le prestazioni eseguendo l'OCR su singole parole? In tal caso, qualcuno può suggerire un modo per delimitare singole parole in un file immagine (ad esempio quello collegato sopra) ed estrarle in immagini separate che possono essere trattate in modo indipendente?
  4. La presenza di grafici e altre immagini incorporati nell'immagine della pagina PDF può interferire con l'OCR? Dovrei rimuovere questi? Se sì, qualcuno può suggerire un metodo per rimuoverli automaticamente?

EDIT: Per semplicità, ecco il codice che ho usato.

import tesseract 
api = tesseract.TessBaseAPI() 
api.Init(".","eng",tesseract.OEM_DEFAULT) 
api.SetPageSegMode(tesseract.PSM_AUTO) 

mImgFile = "eurotext.jpg" 
mBuffer=open(mImgFile,"rb").read() 
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api) 
print "result(ProcessPagesBuffer)=",result 

E qui è il codice alterativa (i cui risultati non sono mostrati in questa questione, anche se le prestazioni sembra essere molto simile).

import cv2.cv as cv 
import tesseract 

api = tesseract.TessBaseAPI() 
api.Init(".","eng",tesseract.OEM_DEFAULT) 
api.SetPageSegMode(tesseract.PSM_AUTO) 

image=cv.LoadImage("eurotext.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) 
tesseract.SetCvImage(image,api) 
text=api.GetUTF8Text() 
conf=api.MeanTextConf() 

Qualcuno potrebbe spiegare le differenze tra questi due snippet?

risposta

12

Tesseract è molto buono sul testo di input pulito (come nell'esempio) se si armeggia un po '. alcuni suggerimenti:

  • Prima l'automazione, iniziano con Tesseract nella riga di comando
  • restringere la set di caratteri, se possibile (ad esempio date un'occhiata a///share/tessdata/configs locali usr a./ Cifre - configurarlo per caratteri inglesi maiuscole/minuscole, ecc) e li presenta come argomento della riga di comando
  • Solo usare PNG o TIFF (TIFF per le versioni precedenti) in formato JPG introduce artefatti
  • Upsample l'immagine in modo il testo è più grande del carattere minuscolo corrente. Righe Tesseract> Caratteri alti 10 pixel (se la memoria serve), sicuramente peggiora con caratteri minuscoli
  • Non c'è bisogno di fare la soglia se sei già a due livelli ma non farà male se lo fai e puoi vedere esattamente la stessa immagine che tesseract vedrà

controllerò di nuovo qui per vedere se posso aiutare di più ma faccio parte della mailing list tesseract, sono davvero utili.

Sidenote - Ho alcune patch per pytesseract che dovrei pubblicare per ottenere caratteri & tramite l'API (che non era possibile un paio di mesi prima). Grida se possono essere utili.

+0

Ozvald, consigli Impressionante, grazie! Sarei davvero interessato a verificare il tuo codice. Hai un repository github o qualcosa del genere? Per quanto riguarda il tipo di file immagine, è accettabile convertire le immagini JPEG in PNG, o il danno è già stato fatto? Chiedo perché molti dei PDF che ho incontrato memorizzano le immagini come JPEG internamente, quindi se il problema è di compressione lossy, allora sono un po 'bloccato con quello che ho. – blz

+1

Nessun repo github, mandami una mail (ian at ianozsvald com) e lo scaverò (ho davvero intenzione di github ...). –

+0

Se è già JPEG, lo salverò come TIFF per evitare di aggiungere alcuni * artefatti * extra. L'aggiunta di rumore aggiuntivo è ciò che si desidera evitare. –

6

Il primo esempio legge il file come un buffer e quindi lo inoltra a tesseract-ocr senza apportare alcuna modifica mentre il secondo legge il file in formato opencv che consente di ritoccare un'immagine come se si modificasse il rapporto aspetto , scala di grigi e ecc. usando la libreria cv. Il secondo metodo è molto utile se vuoi fare la manipolazione dell'immagine prima di passare l'immagine a tesseract.

BTW, sono il proprietario di python-tesseract. Se u vuole fare la domanda, si può sempre il benvenuto per inoltrare la tua domanda a http://code.google.com/p/python-tesseract

Joe

+0

grazie mille per il chiarimento. In realtà mi stavo chiedendo da dove venisse l'occasione! Ti inoltrerò per qualsiasi domanda che ho, grazie! – blz

Problemi correlati