Я работаю над проектом, который включает в себя извлечение текстовых научных документов, хранящихся в формате PDF. Для большинства документов это довольно легко выполняется с помощью PDFMiner, но некоторые старые документы хранят свой текст в виде больших изображений. По сути, бумага сканируется и файл изображения (обычно PNG или JPEG) содержит всю страницу.
Я попытался использовать движок Tesseract через python-tesseract привязки, но результаты довольно разочаровывают.
Прежде чем погрузиться в вопросы, которые у меня есть с этой библиотекой, я хотел бы упомянуть, что я открыт для предложений для библиотек OCR. Похоже, что существует немного родных решений python.
Здесь - результат моей попытки 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()
Может ли кто-нибудь объяснить различия между этими двумя фрагментами?