Почему я получаю такие плохие результаты от Tesseract для простого распознавания одного символа? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь использовать Tesseract для распознавания одного символа, и результаты ужасны.«h» распознается как «n», «4» как «/ i», «O» как «()»;

h_char

4_char

O_char

Режим одного символа, кажется, не работает, так как многие символы распознаются как два символа, а не как один.Мои изображения - простые двухуровневые черно-белые изображения TIFF, латинские буквы.Это растровый шрифт, а не отсканированные изображения, они абсолютно чистые и не нуждаются в улучшении.Правильно распознается только около половины символов, что представляется очень низким процентом для такой простой задачи.

Используемая мной версия библиотеки Тессеракта - «4.0.0-бета.3».Вот как я называю Тессеракт.

 int CharRecognizer::recognizeTIFFData(char* data, int datalength){
            char *outText;
            TessBaseAPI* api = new TessBaseAPI();

            if (api->Init(NULL, "eng")) {
                    fprintf(stderr, "Could not initialize tesseract.\n");
                    exit(1);
            }
            api->SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
            Pix *image = pixReadMem(data,datalength);
            api->SetImage(image);
            // Get OCR result
            outText = api->GetUTF8Text();
            printf("\nOCR output:\n%s", outText);
            // Destroy used object and release memory
            int utf8 = outText[0];
            api->End();
            delete[] outText;
            pixDestroy(&image);
            return utf8;
 }

Я новичок в Тессеракте, поэтому, возможно, я что-то упустил.Должен ли я сначала как-то тренировать библиотеку?Может быть, я должен установить другой OcrEngineMode?Я не ожидал никаких проблем с простым распознаванием растровых шрифтов, и теперь я совершенно потерян.Большое спасибо заранее, Юлиана

1 Ответ

0 голосов
/ 16 октября 2018

Мне удалось заставить тессеракт давать правильные результаты в вашем случае, добавив рамку размером 1x1 пиксель вокруг ваших изображений.Я протестировал это с помощью инструмента командной строки tesseract в Linux:

$ tesseract R2a51.png stdout --psm 10
n
$ convert R2a51.png -border 1x1 R2a51.border.png
$ tesseract R2a51.border.png stdout --psm 10
h

Инструмент convert используется для создания версии изображения с рамкой.

Кажется, чтоtesseract не может правильно обрабатывать символы, граничащие с краем изображения (по крайней мере, с настройками по умолчанию).

NB Ваш третий символ по-прежнему распознается как 0, а не O, но я не уверен, что это можно считать распознаванием символов.ошибка.Возможно, вы захотите заглянуть в белые списки символов тессеракта, чтобы разобраться с этим.

Редактировать: Похоже, что «устаревший алгоритм Тессеракта» работает с вашими изображениями без изменений.Он может быть вызван из командной строки через --oem 0.Имейте в виду, что вам нужно найти соответствие *.traineddata для вашего языка в каталоге tessdata.Соответствующий вариант можно скачать с https://github.com/tesseract-ocr/tessdata

...