2016-01-16 95 views
7

問題:大約一週前,爲了更好地改進Tesseract的準確性,我添加了高斯模糊/ OTSU二值化組合,從而生成漂亮的二進制圖像,如附件。我在openCV中這樣做,所以我傳遞給Tesseract的圖像已經是一個二進制圖像(如附圖所示)。當Tesseract對圖像進行預處理時(即使是下面發佈的圖像),圖像也會被破壞,因此不會產生有意義的輸出。請參閱示例輸入下方的圖像,瞭解Tesseract對圖像所做的事情。OpenCV高斯模糊打破Tesseract?

問題的根源在於高斯模糊。如果我刪除它,那麼tesseract輸出的Thresholded image不是亂碼,但它也不像我附加的二進制映像那樣乾淨可讀。我可以禁用Tesseract預處理我傳遞的圖像嗎?爲什麼高斯模糊完全毀了Tesseract?我感覺好像輸入圖像和我所附的圖像一樣清晰,準確性會提高。

兩張圖片都是同一列。首先是輸入圖像,其次是Tesseract圖像預處理的結果。

輸入到超正方體實施例:

image

超正方體損壞(來自GetThresholdedImage()獲得:

two

回答

1

我建議從保存的tesseract圖像數據(tess.GetThresholdedImage())並在tess.SetImage()後將其存儲到磁盤,因此您可以確保您爲OCR提供了正確的映像。

+0

好吧,這幫了很多!因此,閾值圖像是一串水平線,所以出現了一些錯誤。我最終將其追蹤到,事實上,我確實在二值化之前爲圖像添加了高斯模糊以改善圖像。但模糊和二值化的結果就像上面提到的那樣^^。一個完美的二值化圖像如何破解tesseract?我知道tesseract也嘗試對圖像進行二值化處理,但是在測試之後,我的圖像更加清晰。有任何想法嗎? –

+1

AFAIK tesseract不會二值化2色圖像。所以我想如何將opencv數據傳遞給tesseract存在問題。我發佈了適用於我的示例。 – user898678

1

此代碼的工作對我來說:

/* 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

是的,這個工程。在我刪除了我在問題中提到的高斯模糊之後,我能夠使代碼生效。現在困擾我的是爲什麼會發生這種情況?而使用'tess.GetThresholdedImage()'並查看該圖像的事實表明由tesseract完成的劣質二值化。當調用'SetImage'時,tesseract在提供的圖像 –

1

目標數據看起來不錯,但它被寫入到較寬的目的地容器,不考慮在重啓目的地光標(X = 0,Y ++),其中有一個源數據中的新行。

+0

上執行閾值操作(除其他外,我確信)。有趣。我想知道高斯模糊與它有什麼關係 –

+0

模糊過程可能會寫入_larger_畫布,以包含所有模糊的內容。例如,如果輸出畫布大於輸入畫布,則以模糊半徑的兩倍,那麼值得檢查一下。 –