2016-01-16 17 views
7

Il problema: circa una settimana fa, nella speranza di migliorare ulteriormente la precisione di Tesseract, ho aggiunto una combinazione guassiana sfocatura/binomio OTSU che risulta in bellissime immagini binarie come quella allegata. Lo faccio in openCV, quindi l'immagine che passo a Tesseract è già un'immagine binaria (come quella allegata). Quando Tesseract esegue la pre-elaborazione dell'immagine (anche quella pubblicata di seguito) l'immagine viene danneggiata e quindi non viene prodotto alcun output significativo. Vedi l'immagine sotto l'input di esempio, per un'idea di cosa sta facendo Tesseract all'immagine.OpenCV Sfocatura gaussiana si rompe Tesseract?

La fonte del problema è la sfocatura di Guassian. Se lo rimuovo, lo Thresholded image output di tesseract non è confuso, ma non è neanche così pulito e leggibile come l'immagine binaria che ho allegato. Posso disabilitare Tesseract dal pre-processing delle immagini che ho passato? Perché una sfocatura di Guassian rovina completamente Tesseract? Mi sento come se l'immagine di input fosse chiara come quella che ho allegato, la precisione sarebbe migliorata.

Entrambe le immagini sono della stessa colonna. La prima è l'immagine di input, la seconda è il risultato della pre-elaborazione dell'immagine di Tesseract.

INGRESSO TESSERACT ESEMPIO:

image

TESSERACT CORRUZIONE (ottenuto da GetThresholdedImage():

two

risposta

1

vorrei suggerire di salvare i dati delle immagini da Tesseract (tess.GetThresholdedImage()) e salvarlo su disco dopo tess.SetImage(), in modo da poter essere sicuri di aver fornito l'immagine corretta per l'OCR.

+0

OK, questo ha aiutato molto! Quindi, l'immagine con la soglia era un gruppo di linee orizzontali, quindi qualcosa stava andando storto. Alla fine ho rintracciato il fatto che, in effetti, ho aggiunto una sfocatura gaussiana all'immagine prima della binarizzazione per un'immagine migliorata. Ma il risultato della sfocatura e della binarizzazione è un'immagine simile a quella sopra ^^. Come può un immagine perfettamente binarizzata interrompere il tesseract? So che tesseract cerca di binarizzare l'immagine, anche, ma la mia immagine è più chiara, dopo i test. Qualche idea? –

+1

Il tesseract AFAIK non esegue il binarize di 2 immagini a colori. Quindi immagino ci sia un problema su come passare i dati opencv su tesseract. Ho pubblicato un esempio che funziona per me. – user898678

1

Questo codice funziona per me:

/* filename: test_opencv2.cpp 
* compile: 
    g++ -std=c++11 test_opencv2.cpp `pkg-config --cflags opencv` \ 
    `pkg-config --cflags tesseract` -o test_opencv2 \ 
    `pkg-config --libs opencv` `pkg-config --libs tesseract` 
* 
*/ 
#include <tesseract/baseapi.h> 
#include <leptonica/allheaders.h> 
#include <opencv2/opencv.hpp> 

int main() { 
    tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); 
    if (api->Init("/usr/local/share/tesseract-ocr/", "eng", tesseract::OEM_TESSERACT_CUBE_COMBINED)) { 
     fprintf(stderr, "Could not initialize tesseract.\n"); 
     return 1; 
    } 

    api->SetPageSegMode(tesseract::PSM_SINGLE_COLUMN); 
    IplImage *img = cvLoadImage("7sqw3.png"); 
    if (img == 0) { 
     fprintf(stderr, "Cannot load input file!\n"); 
     return 1; 
    } 
    api->SetImage((unsigned char*)img->imageData, img->width, 
        img->height, img->nChannels, img->widthStep); 


    char* outText = api->GetUTF8Text(); 
    printf("OCR output:\n\n"); 
    printf(outText); 

    api->Clear(); 
    api->End(); 
    delete [] outText; 
    delete api; 
    cvReleaseImage(&img); 

    return 0; 
} 
+0

Sì, questo funziona. Sono stato in grado di far funzionare il mio codice dopo aver rimosso la sfocatura gaussiana che menziono nella mia domanda. Ciò che mi disturba ora è perché succede? E il fatto che l'uso di 'tess.GetThresholdedImage()' e la visualizzazione di quell'immagine mostrano una binarizzazione inferiore, fatta da tesseract. Quando viene chiamato 'SetImage', tesseract esegue un'operazione di soglia (tra le altre cose, ne sono sicuro) sull'immagine fornita –

1

I dati di destinazione sembra OK, ma è in fase di scrittura più ampio contenitore di destinazione, senza considerare riavviare il cursore destinazione a (x = 0, y ++) dove c'è un nuova riga nei dati di origine.

+0

Hmm. Interessante. Mi chiedo che effetto ha una sfumatura gaussiana –

+0

È possibile che il processo di sfocatura venga scritto su una tela _larger_, per includere tutto il contenuto sfocato. Se, per esempio, la tela di output è più grande della tela di input, di due volte il raggio di sfocatura, allora vale la pena di verificarlo. –

Problemi correlati