我正在开展一个项目,该项目涉及提取以 PDF 格式存储的文本科学论文。对于大多数论文,使用 PDFMiner 很容易完成,但一些较旧的论文将其文本存储为大图像。本质上,扫描一张纸,该图像文件(通常是 PNG 或 JPEG)包含整个页面。
我尝试通过它的python-tesseract绑定使用 Tesseract 引擎,但结果非常令人失望。
在深入探讨我对这个库的问题之前,我想提一下,我愿意接受有关 OCR 库的建议。似乎很少有原生的 python 解决方案。
这是我试图提取文本的一张这样的图像(JPEG)。我在上面链接到的 python-tesseract google 代码页上的示例片段中提供的确切代码。我应该提到文档有点稀疏,所以很可能我的代码中的许多选项之一配置错误。任何建议(或深入教程的链接)将不胜感激。
这是我尝试 OCR 的输出。
我的问题如下:
- 我正在使用的代码中是否有任何不理想的地方?有没有更好的方法来做到这一点?也许是一个不同的图书馆?
- 我可以执行什么样的预处理来改进检测?这些图像都是黑白的,但我是否应该设置一个阈值并将其上方的任何内容设置为单值黑色,并将其下方的所有内容设置为空值白色?还要别的吗?
- 一个更具体的问题:可以通过对单个单词执行 OCR 来提高性能吗?如果是这样,任何人都可以建议一种方法来分隔图像文件中的单个单词(例如:上面链接的那个)并将它们提取到可以独立处理的单独图像中吗?
- PDF 页面图像中嵌入的图形和其他图像的存在是否会干扰 OCR?我应该删除这些吗?如果是这样,任何人都可以建议一种自动删除它们的方法吗?
编辑: 为简单起见,这是我使用的代码。
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()
谁能解释这两个片段之间的区别?