Pytesseract: OCR и извлечение текста из изображений
Pytesseract - обертка на Python для движка Tesseract OCR, которая распознает текст на изображениях и возвращает его строкой, таблицей слов с координатами или готовым PDF. Ниже описано, как установить движок и языковые пакеты, распознать русский текст, выбрать режим сегментации страницы и подготовить картинку, чтобы ошибок в результате было меньше.

Содержание статьи
Как устроен pytesseract
Сама библиотека ничего не распознает. Она сохраняет изображение во временный файл, запускает программу tesseract из командной строки и читает ее вывод. Поэтому установка состоит из двух частей: движок ставится в систему, а пакет на Python ставится через pip.
Tesseract начинали в HP, позже его развивала Google, сейчас проект поддерживает сообщество. Начиная с версии 4 в движке работает распознавание на нейросети LSTM, которое заметно точнее старого режима на обычных шрифтах. Рукописный текст и сложные фоны Tesseract распознает плохо, для них нужны другие инструменты.
Установка Tesseract и пакета
Порядок действий зависит от операционной системы. Языковые данные нужны для каждого языка отдельно, по умолчанию доступен только английский.
- Windows: установщик от UB Mannheim, при установке отметить Russian в списке языков. Путь к программе обычно
C:\Program Files\Tesseract-OCR. - Ubuntu и Debian:
sudo apt install tesseract-ocr tesseract-ocr-rus. - macOS:
brew install tesseract tesseract-lang.
После движка ставятся пакеты Python: pip install pytesseract pillow. Pillow нужен, чтобы открывать и обрабатывать картинки, об этом подробнее в статье про Pillow. Если Windows не добавила Tesseract в переменную PATH, путь указывают в коде:
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
print(pytesseract.get_tesseract_version()) # например 5.4.0
print(pytesseract.get_languages()) # ['eng', 'osd', 'rus']Если список языков не содержит rus, распознавание с русским языком завершится ошибкой TesseractError: файла rus.traineddata нет в папке tessdata.
Распознавание текста с изображения
Основная функция image_to_string() принимает объект Pillow, путь к файлу или массив NumPy и возвращает строку. Язык задается параметром lang, несколько языков перечисляют через плюс.
from PIL import Image
import pytesseract
image = Image.open("scan.png")
text = pytesseract.image_to_string(image, lang="rus+eng")
print(text.strip())Указывать только нужные языки важно: лишний язык замедляет работу и добавляет ошибки, когда похожие буквы кириллицы и латиницы путаются между собой. Если на картинке только русский текст, ставьте lang="rus".
Параметр config и режимы psm
Через config передаются параметры командной строки Tesseract. Самый полезный из них --psm, режим сегментации страницы: он подсказывает движку, как расположен текст.
| --psm | Когда использовать |
|---|---|
| 3 | значение по умолчанию, автоматический разбор страницы |
| 4 | одна колонка текста разного размера, например чек |
| 6 | один ровный блок текста |
| 7 | одна строка |
| 8 | одно слово |
| 11 | разрозненный текст без порядка |
Для распознавания только цифр, например номеров или сумм, к режиму добавляют белый список символов:
digits = pytesseract.image_to_string(
image,
config="--psm 7 -c tessedit_char_whitelist=0123456789",
)
print(digits)Слова с координатами и уверенностью
Функция image_to_data() возвращает каждое найденное слово с его положением на картинке и оценкой уверенности от 0 до 100. С параметром output_type=Output.DICT результат приходит словарем списков, где элементы с одинаковым индексом относятся к одному слову.
from pytesseract import Output
data = pytesseract.image_to_data(image, lang="rus", output_type=Output.DICT)
for word, conf, x, y in zip(data["text"], data["conf"], data["left"], data["top"]):
if word.strip() and float(conf) > 60:
print(f"{word} ({conf}) at {x},{y}")По этим данным удобно отсеивать мусор с низкой уверенностью или рисовать рамки вокруг слов. Для отдельных символов есть image_to_boxes(), а image_to_osd() определяет поворот страницы и систему письма.
Сохранение в PDF с текстовым слоем
Функция image_to_pdf_or_hocr() превращает скан в PDF, в котором текст можно выделять и искать. Она возвращает байты, их остается записать в файл.
pdf = pytesseract.image_to_pdf_or_hocr("scan.png", lang="rus", extension="pdf")
with open("scan.pdf", "wb") as f:
f.write(pdf)Склеить несколько таких страниц в один документ можно библиотекой PyPDF2.
Подготовка изображения
Качество распознавания больше зависит от картинки, чем от настроек. Tesseract рассчитан на черный текст на белом фоне с высотой заглавных букв около 20-30 пикселей. Фото с телефона, мелкий шрифт и цветной фон стоит обработать перед распознаванием.
from PIL import Image, ImageOps
img = Image.open("photo.jpg")
img = ImageOps.grayscale(img) # оттенки серого
img = img.resize((img.width * 2, img.height * 2)) # увеличить мелкий текст
img = img.point(lambda p: 255 if p > 150 else 0) # бинаризация
print(pytesseract.image_to_string(img, lang="rus"))Порог 150 подбирают под конкретные снимки: на темных фото его снижают, на бледных повышают. Для неровного освещения лучше подходит адаптивная бинаризация из OpenCV (cv2.adaptiveThreshold). Перекошенный скан выравнивают поворотом, угол можно узнать через image_to_osd().
Типичные ошибки
Большинство проблем с pytesseract связаны с установкой движка, а не с кодом.
TesseractNotFoundError: программа tesseract не найдена. Проверьте установку и укажитеtesseract_cmd.TesseractErrorс упоминанием Failed loading language: нет языкового файла, установите пакет нужного языка.- Пустая строка в результате: слишком мелкий или светлый текст, попробуйте увеличить и бинаризовать картинку или сменить
--psm. - Латинские буквы вместо русских: не передан
lang="rus".
Полное описание функций и параметров есть на странице проекта pytesseract на GitHub.
Частые вопросы
Ответы на вопросы, которые чаще всего задают при работе с pytesseract.
Можно ли распознать текст из PDF?
Tesseract принимает только изображения. Страницы PDF сначала рендерят в картинки, например пакетом pdf2image (нужен Poppler) или PyMuPDF, а затем передают в image_to_string().
Распознает ли pytesseract рукописный текст?
Почти нет: модели Tesseract обучены на печатных шрифтах. Для рукописи используют облачные OCR-сервисы или специализированные нейросети.
Как ускорить распознавание большого количества файлов?
Обрезайте картинку до области с текстом, указывайте один язык и запускайте обработку файлов параллельно через concurrent.futures.ProcessPoolExecutor, так как каждый вызов запускает отдельный процесс tesseract.
Чем pytesseract отличается от EasyOCR?
EasyOCR работает на PyTorch, лучше справляется с фотографиями и текстом на сложном фоне, но тяжелее и медленнее без видеокарты. Pytesseract легче, быстрее на чистых сканах и не требует скачивания больших моделей.