2016-01-16 73 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_画布,以包含所有模糊的内容。例如,如果输出画布大于输入画布,则以模糊半径的两倍,那么值得检查一下。 –