Распознание текста в определенной области скана PDF в Python
Есть скан документа в pdf формате. Как распознать текст в определенной области такого документа, точнее цифровой номер?

Ответы (2 шт):
Общие положения
Я опускаю момент, который раскрывает вопрос, как преобразовать pdf в картинку. Для этого есть либы. Пример использования можете посмотреть в аналогичном проекте, который занимается похожей задачей. Например, здесь.
Есть 2 подхода:
- алгоритм на основе обучающей выборки (классическое машинное обучение)
- алгоритм на основе эвристик (old-school методы)
Нужно сразу понять, что не получится с полпинка решить эту задачу. Она исследовательская и придётся приложить некоторые усилия для её решения. Я дам вектор движения.
Алгоритм на основе обучающей выборки
Скорее всего Вам не подойдёт первый, поскольку он сложнее в реализации, но более общий и совершенный в плане подхода. С другой стороны, есть много утилит, которые помогут разметить данные. Например, есть толока, labelImg и другие. Как платные так и бесплатные. Далее, если Вы найдёте хорошую модель, то можно сделать очень неплохое решение крайне быстро. Но тут много деталей. Поэтому я опущу этот вопрос. И далее буду рассматривать только 2 подход.
Вы можете выбрать этот подход. Тогда Вам следует изучить как работать со свёрточными нейронными сетями и дообучать их. Но даже в этом случае, скорее всего, весь процесс будет состоять из нескольких этапов.
Подход на основе эвристик
У нас есть несколько подзадач.
- Стандартизировать скан (избавиться от небольших поворотов)
- Выделить зону, в которой располагается объект (локализовать по пикселям место, где находится зона)
- Сегментировать объект
- Преобразовать объект в текст
Стандартизировать скан
Предлагается каким-нибудь способом выровнять картинку. Это можно сделать опять же либо с помощью предварительной разметки данных. Либо же с помощью эвристик. Можно посчитать "гистограммы" изображений суммировать по вертикали и горизонтали изображения и на этой основе делать вывод, насколько следует повернуть картинку. Можно придумать другие подходы. Что-то похожее есть тут.
Выделить зону, в которой располагается объект
Взять с запасом пикселей и вырезать подизображение.
Сегментировать объект
Аналогично, как рассказано выше, можно рассматривать изображение как матрицу и складывать по горизонтали и вертикали её по той же ссылке, что и выше. А затем отделять подстроки друг от друга.
Tesseract или другой распознователь
Я бы не советовал использовать tesseract, так как раньше он был неустойчив и часто сбоил. Сейчас я слышал иные отзывы. Возможно, что-то изменилось. Попробуйте. Но есть масса других решений, которые умеют распозновать цифры. Можете поискать на гитхабе.
- Кропаете верхнюю часть картинки с запасом.
- Template Matching слова "Заказ" см. https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html
- Кропаете, исходя из найденого положения слова "Заказ" область с его номером.
- P.S. Попробуйте распознать QR код, может быть номер заказа уже в нем содержится. P.P.S. В QR коде такая информация: БЗ_3000-0052-06_13_1,2792_52_53_57_58