Подтвердить что ты не робот

Улучшение эффективности OCR при многопараметрическом просмотре

Я работаю над проектом, который включает в себя извлечение текстовых научных документов, хранящихся в формате PDF. Для большинства документов это довольно легко выполняется с помощью PDFMiner, но некоторые старые документы хранят свой текст в виде больших изображений. По сути, бумага сканируется и файл изображения (обычно PNG или JPEG) содержит всю страницу.

Я попытался использовать движок Tesseract через python-tesseract привязки, но результаты довольно разочаровывают.

Прежде чем погрузиться в вопросы, которые у меня есть с этой библиотекой, я хотел бы упомянуть, что я открыт для предложений для библиотек OCR. Похоже, что существует немного родных решений python.

Здесь есть одно такое изображение (JPEG), на котором я пытаюсь извлечь текст. Я точный код, приведенный в примерах фрагментов на странице кодов Google python-tesseract, с которой я связан выше. Я должен упомянуть, что документация немного разрежена, поэтому вполне возможно, что одна из многих опций в моем коде неправильно настроена. Любые советы (или ссылки на углубленные учебные пособия) будут высоко оценены.

Здесь - результат моей попытки OCR.

Мои вопросы заключаются в следующем:

  • Есть ли что-нибудь субоптимальное в коде, который я использую? Есть ли лучший способ сделать это? Возможно, есть другая библиотека?
  • Какую предварительную обработку можно выполнить для улучшения обнаружения? Все изображения B & W, но должен ли я установить пороговое значение и установить что-либо выше его на черный цвет с одним значением и все ниже, до белого белого цвета с нулевым значением? Что-нибудь еще?
  • Более конкретный вопрос: можно ли улучшить производительность, выполнив OCR на отдельные слова? Если да, может ли кто-нибудь предложить способ разграничения отдельных слов в файле изображения (например, связанного выше) и извлечения их на отдельные изображения, которые можно обрабатывать независимо?
  • Может ли присутствие графиков и других изображений, встроенных в изображение страницы PDF, мешать OCR? Должен ли я удалить их? Если да, может ли кто-нибудь предложить метод для их автоматического удаления?

EDIT: Для простоты здесь используется код, который я использовал.

import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)

mImgFile = "eurotext.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result

И вот альтернативный код (результаты которого не показаны в этом вопросе, хотя производительность, похоже, очень похожа).

import cv2.cv as cv
import tesseract

api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)

image=cv.LoadImage("eurotext.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
tesseract.SetCvImage(image,api)
text=api.GetUTF8Text()
conf=api.MeanTextConf()

Может ли кто-нибудь объяснить различия между этими двумя фрагментами?

4b9b3361

Ответ 1

Tesseract очень хорош в чистом текстовом тексте (например, в вашем примере), если вы немного потрудились. некоторые предложения:

  • Перед автоматизацией начните с tesseract в командной строке
  • Ограничьте свой набор символов, если это возможно (например, посмотрите в /usr/local/share/tessdata/configs на./digits - настройте его для английского верхнего/нижнего регистра и т.д.) и укажите его как аргумент командной строки
  • Используйте только изображения PNG или TIFF (TIFF для более старых версий), поскольку JPG вводит артефакты
  • Увеличьте изображение, чтобы текст был больше, чем текущий маленький шрифт. Строки Tesseract > 10 символов в пикселях (если используется память), он, безусловно, хуже работает с маленькими символами.
  • Не нужно делать пороговое значение, если вы уже двууровневы, но это не повредит, если вы это сделаете, и вы можете увидеть ровно то же изображение, которое tesseract увидит

Я вернусь сюда, чтобы узнать, могу ли я помочь больше, но присоединяюсь к списку рассылки tesseract, они действительно полезны.

Sidenote. У меня есть некоторые исправления для pytesseract, которые я должен опубликовать для получения персонажей, доверенностей и слов через API (что было невозможно пару месяцев назад). Кричите, если они могут быть полезны.

Ответ 2

В первом примере файл читается как буфер, а затем ретранслирует его на tesseract-ocr без каких-либо изменений, в то время как второй считывает файл в формат opencv, который затем позволит вам сделать какое-то изображение, касающееся, как изменение соотношения сторон, серая шкала и т.д., используя библиотеку cv. Второй метод очень полезен, если вы хотите выполнить манипуляции с изображениями перед передачей изображения в tesseract.

Кстати, я являюсь владельцем python-tesseract. Если вы хотите задать вопрос, вы всегда можете отправить свой вопрос на адрес http://code.google.com/p/python-tesseract

Джо