Обнаружение чисел с низким разрешением Tesseract повышает точность

#c# #image-processing #numbers #ocr #tesseract

#c# #обработка изображений #числа #распознавание #тессеракт

Вопрос:

Я хотел бы попросить некоторую информацию / помощь о том, как я мог бы улучшить точность распознавания. Мои целевые изображения имеют низкое разрешение (скриншоты), и я бы очень предпочел не увеличивать их масштаб, так как моя программа должна работать быстро.

У меня есть 2 изображения. Я не вижу видимой разницы между ними, однако у tesseract возникают проблемы с одним.

изображение 1 изображение 2

введите описание изображения здесь
введите описание изображения здесь

Проблема заключается в первом изображении, результат, который я получаю: 251 n41 n31 n11 n11 n11 n Как вы можете видеть, что-то не так с тем, как он обрабатывает интервал. Когда что-то начинает идти не так, появляется 2 новых строки.

Между тем, на втором изображении я получаю ожидаемый результат: 300 n60 n40 n n1 n15 n15 n10 n6 n15 n Эти изображения были созданы с помощью следующих шагов предварительной обработки:

 image.Alpha(AlphaOption.Remove);
image.BlackThreshold(new Percentage(27));
image.Negate(); // Original image has white text on black background
  

Я ограничил кодировку tesseract только цифрами (01234567890-).
Я пробовал различные режимы сегментации (SparseText, SingleColumn, SingleBlock). Я использую Tesseract 4.1. У вас, ребята, есть какие-нибудь указания?

Или, может быть, вы могли бы сказать мне, какой алгоритм изменения размера быстрый и подходит для распознавания текста?

Комментарии:

1. Даже на втором изображении есть дополнительная новая строка после 40. Для изменения размера попробуйте эту функцию

Ответ №1:

Если у вас возникли проблемы с Tesseract и вы рассматриваете возможность использования более надежной библиотеки без необходимости обучения, вы можете попробовать использовать коммерческую библиотеку, такую как Leadtools. С помощью Leadtools OCR toolkit я смог получить отличные результаты для обоих изображений, используя только базовую обработку изображений, встроенную в демонстрационную версию OCR. Однако существуют более сложные функции обработки изображений, которые при необходимости можно использовать для более сложных задач. Помимо демонстрации OCR, я также смог получить те же результаты в форме JSON без какой-либо предварительной обработки из одного из руководств, размещенных здесь ниже. В качестве отказа от ответственности я работаю на этого поставщика.

https://www.leadtools.com/help/sdk/v21/tutorials/dotnet-console-export-ocr-results-to-json.html

Вот несколько упрощенных исходных кодов, которые позволят выполнить ту же задачу для одного изображения и распечатать необработанный текст:

 // Create a new OCR engine with the default settings
IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
ocrEngine.Startup(null, null, null, null);

// Create an OCR document to hold everything
using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument()){
    // Add the input image as a new page
    using(IOcrPage page = ocrDocument.Pages.AddPage(inputFilename, null)){
        // Perform OCR on just the one page
        page.Recognize(null);
        
        // build a string from the recognized characters
        string text = page.GetText(0);
        
        // Show output
        Console.WriteLine($"text: '{text}'");
    }   
}
  

Результаты, которые я получил для двух изображений, были «251 r n41 r n31 r n1 r n11 r n7 r n4 r n11 r n» и «300 r n60 r n40 r n1 r n15 r n15 r n10 r n6 r n15 r n «.