#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 «.