Вопрос или проблема
import ocrmypdf
from pdf2image import convert_from_path
from PIL import Image, ImageEnhance, ImageFilter
import numpy as np
import img2pdf
import io
import cv2
def preprocess_image(img):
"""
Функция предобработки изображения (увеличение контраста, снижение шума)
"""
# Преобразовать в градации серого
img = img.convert('L')
# Улучшить контраст
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2) # Увеличить контраст
# Применить снижение шума (по желанию)
img = img.filter(ImageFilter.MedianFilter())
# Преобразовать обратно в массив для исправления перекоса
gray = np.array(img)
# Применить пороговую обработку
_, thresh_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
return Image.fromarray(thresh_img)
# Этап 1: Извлечение изображений из PDF
images = convert_from_path(raw_input, dpi=300)
# Этап 2: Предобработка изображений
preprocessed_images = [preprocess_image(img) for img in images]
# Этап 3: Сохранение предобработанных изображений в новый PDF с использованием BytesIO
preprocessed_pdf_path="preprocessed.pdf"
# Создание списка для хранения потоков изображений
image_streams = []
for img in preprocessed_images:
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format="JPEG")
img_byte_arr.seek(0) # Перейти в начало буфера BytesIO
image_streams.append(img_byte_arr)
# Преобразовать список потоков изображений в PDF
with open(preprocessed_pdf_path, 'wb') as f:
f.write(img2pdf.convert(image_streams))
# Этап 4: Запустить ocrmypdf на новом PDF
ocrmypdf.ocr(preprocessed_pdf_path, stg_pdf_path, skip_text=True)
Я использую приведенный выше код для OCR отсканированного pdf файла, отсканированный pdf казался мне очень чистым и читаемым. Однако есть одна строка, которая всегда отсутствует (строка рядом с красной стрелкой на изображении ниже). Я немного поизучал, но не могу найти работающее решение.
Ответ или решение
Устранение проблемы пропуска текста в Tesseract OCR
В процессе работы с OCR (оптическим распознаванием текста) пользователи могут столкнуться с проблемой, когда некоторые строки текста не распознаются. В вашем случае это касается линии, расположенной рядом с красной стрелкой на предоставленном изображении. Давайте обсудим несколько факторов, которые могут повлиять на качество распознавания и способы их устранения.
1. Качество исходного изображения
Хотя вы упомянули, что сканированный PDF файл выглядит чистым и читаемым, важно учитывать, что качество изображения, используемое для OCR, имеет критическое значение. Некоторые аспекты, которые стоит проверить:
- Разрешение: Убедитесь, что вы используете достаточное разрешение для OCR. Рекомендуется минимум 300 точек на дюйм (DPI) для качественного распознавания.
- Четкость текста: Проверьте, не искажены ли линии текста или есть ли размытые участки. Даже при высоком разрешении несосредоточенные или размытые текстовые элементы могут вызывать проблемы при распознавании.
2. Предобработка изображений
Ваш код включает процесс предобработки изображений, который включает контрастность и уменьшение шума. Однако рассмотрите следующие дополнения:
- Регулировка порога: Вместо фиксированного порога 150 попробуйте использовать адаптивное пороговое значение, что может помочь улучшить распознавание на определенных участках изображения.
- Настройки фильтров: Используйте дополнительные методы фильтрации, такие как гауссово размывание для уменьшения шума, что может помочь улучшить четкость текста.
Пример изменения пороговой обработки:
# Применение адаптивного порогового преобразования
thresh_img = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2)
3. Настройки Tesseract OCR
На результаты работы Tesseract также могут повлиять его настройки. Рекомендуется проверить следующие аспекты:
- Язык: Убедитесь, что Tesseract настроен на правильный язык, так как использование неправильной языковой модели может приводить к проблемам с распознаванием.
# Пример вызова Tesseract с указанием языка
ocrmypdf.ocr(preprocessed_pdf_path, stg_pdf_path, skip_text=True, language='rus')
- Параметры конфигурации: Используйте различные параметры Tesseract, такие как
--psm
, которые определяют режимы обработки страниц. Экспериментируйте с разными режимами, например, с--psm 6
(предполагается одностраничный текст) или--psm 11
(предполагается наличие объектов, а не текста).
4. Контроль после обработки
После выполнения OCR проверьте результирующий текст:
- Визуальная проверка: Визуально проверьте OCR результат для выявления пропусков или ошибок.
- Кросс-проверка: Используйте другой инструмент OCR для проверки полученных результатов.
Заключение
Ошибки распознавания текста могут произойти по множеству причин, однако, следуя предложенным рекомендациям, вы можете повысить вероятность успешного распознавания текста Tesseract OCR. Важно постоянно тестировать и настраивать параметры для достижения лучшего результата. Если проблема сохраняется, возможно, стоит обратиться к экспертам в области OCR или рассмотреть альтернативные инструменты, которые могут быть более адаптированы к вашим специфическим требованиям.