Integration Tesseract OCR для распознавания текста
Tesseract — открытый OCR-движок от Google, стандарт для встраивания OCR в собственные системы. Работает полностью локально без cloud-зависимостей, поддерживает 100+ языков включая русский. Версия 5 добавила LSTM engine, который существенно улучшил качество распознавания по сравнению с классическим движком.
Установка и базовая интеграция
import pytesseract
from PIL import Image
import cv2
import numpy as np
# Базовое распознавание
def extract_text(image_path: str, lang: str = 'rus') -> str:
image = Image.open(image_path)
text = pytesseract.image_to_string(image, lang=lang, config='--psm 3')
return text
# Детальный вывод с позициями
def extract_with_positions(image_path: str, lang: str = 'rus') -> list[dict]:
image = Image.open(image_path)
data = pytesseract.image_to_data(
image,
lang=lang,
output_type=pytesseract.Output.DICT
)
results = []
for i, text in enumerate(data['text']):
if text.strip() and int(data['conf'][i]) > 0:
results.append({
'text': text,
'confidence': int(data['conf'][i]),
'x': data['left'][i],
'y': data['top'][i],
'w': data['width'][i],
'h': data['height'][i]
})
return results
Параметры PSM (Page Segmentation Mode)
| PSM |
Описание |
Использование |
| 0 |
Только ориентация |
Редко |
| 3 |
Авто (default) |
Общий текст |
| 6 |
Одиночный блок текста |
Абзацы |
| 7 |
Одна строка |
Поля форм |
| 8 |
Одно слово |
Штампы, печати |
| 11 |
Разреженный текст |
Накладные, счета |
| 13 |
Raw line |
Технические строки |
Optimization под русский язык
custom_config = (
'--psm 6 '
'--oem 3 ' # LSTM engine
'-c preserve_interword_spaces=1 '
'-c tessedit_char_whitelist='
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,!?-:;'
)
text = pytesseract.image_to_string(image, lang='rus+eng', config=custom_config)
Предобработка для повышения точности
def prepare_for_tesseract(image: np.ndarray,
scale_factor: float = 2.0) -> np.ndarray:
# Upscale — Tesseract работает лучше при 300+ DPI
h, w = image.shape[:2]
image = cv2.resize(image, (int(w * scale_factor), int(h * scale_factor)),
interpolation=cv2.INTER_CUBIC)
# Grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Adaptive threshold — лучше для неравномерного освещения
processed = cv2.adaptiveThreshold(
gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 31, 2
)
# Dilate для улучшения соединений символов
kernel = np.ones((1, 1), np.uint8)
processed = cv2.dilate(processed, kernel, iterations=1)
processed = cv2.erode(processed, kernel, iterations=1)
return processed
Training кастомной языковой модели
Для специфических доменов (медицинские термины, технические аббревиатуры) — добавление custom wordlist:
# Создание custom .traineddata
combine_tessdata -u rus.traineddata rus.
# Добавляем кастомный словарь в rus.user-words
echo "ЭКГ МРТ КТ УЗИ" > rus.user-words
| Сценарий |
Точность |
Скорость |
| Печатный текст, хорошее качество |
95–98% |
0.5–2 сек/страница |
| Печатный текст, сканы среднего качества |
85–92% |
1–3 сек/страница |
| Смешанный текст (рус+eng) |
88–95% |
1–3 сек/страница |
| Задача |
Срок |
| Базовая интеграция Tesseract |
3–5 дней |
| Optimization под конкретные документы |
1–2 недели |
| Custom training для специальных шрифтов |
2–4 недели |