2016-01-16 3 views
7

Проблема: неделю назад, в надежде улучшить точность Tesseract больше, я добавил комбинацию размытия гуасов/OTSU, которая приводит к красивым бинарным изображениям, таким как прикрепленный. Я делаю это в openCV, поэтому изображение, которое я передаю Tesseract, уже является бинарным изображением (например, прикрепленным). Когда Tesseract выполняет свою предварительную обработку изображения (даже тот, который указан ниже), изображение становится поврежденным и, следовательно, никакого значимого вывода не создается. Посмотрите изображение под примером ввода, чтобы понять, что делает Tesseract с изображением.Размытие по Гауссу OpenCV Tesseract?

Источником проблемы является размытие гуася. Если я удалю его, то Thresholded image, что выходы tesseract не искажены, но он также не так чист и читабельен, как бинарное изображение, которое я прикреплял. Могу ли я отключить Tesseract от предварительной обработки изображений, которые я передал? Почему гусановское размытие полностью разрушает Тессеракт? Мне кажется, что входное изображение было таким же ясным, как и тот, который я приложил, точность была бы улучшена.

Оба изображения одного столбца. Первое - это входное изображение, второе - результат предварительной обработки изображения Tesseract.

ВХОД В тессеракт ПРИМЕР:

image

TESSERACT КОРРУПЦИЯ (получен из GetThresholdedImage():

two

ответ

1

Я хотел бы предложить, чтобы сохранить данные изображения из тессеракта (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

Данные назначения в порядке, но это записывается в шире назначения контейнера, не считая перезагрузки курсор назначения в точке (х = 0, у ++), где есть новая строка в исходных данных.

+0

Хмм. Интересно. Интересно, что с ним связано гауссовское размытие. –

+0

Возможно, что процесс размытия записывается на холст _larger_, чтобы включить все размытое содержимое. Если, например, холст вывода больше, чем входной холст, вдвое меньший радиус размытия, то стоит проверить это. –

Смежные вопросы