我正在开展一个项目,该项目涉及提取以 PDF 格式存储的文本科学论文。对于大多数论文,使用 PDFMiner 很容易完成,但一些较旧的论文将其文本存储为大图像。本质上,扫描一张纸,然后该图像文件(通常是 PNG 或 JPEG)构成整个页面。
我尝试通过 python-tesseract 使用 Tesseract 引擎。绑定(bind),但结果相当令人失望。
在深入探讨我对这个库的问题之前,我想提一下,我愿意接受有关 OCR 库的建议。似乎没有什么原生的python解决方案。
Here是我试图提取文本的一张这样的图像(JPEG)。我在上面链接到的 python-tesseract google 代码页上的示例片段中提供的确切代码。我应该提到文档有点稀疏,所以很可能我的代码中的许多选项之一配置错误。任何建议(或深入教程的链接)将不胜感激。
Here是我尝试 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()
谁能解释这两个片段之间的区别?
最佳答案
如果您稍微修改一下,Tesseract 在干净的输入文本(如您的示例)上非常好。一些建议:
- 在自动化之前,先在命令行从 tesseract 开始
- 尽可能限制您的字符集(例如,查看/usr/local/share/tessdata/configs 的 ./digits - 将其配置为英文字符大写/小写等)并将其作为命令行参数提供
- 仅使用 PNG 或 TIFF 图像(旧版本为 TIFF),因为 JPG 会引入人工制品
- 对图像进行上采样,使您的文字比当前的小字体大。 Tesseract 行 >10 像素高的字符(如果没有记错的话),对于小字符,它的性能肯定会更差
- 如果您已经是双层,则无需进行阈值处理,但这样做不会有任何伤害,并且您可以看到与 tesseract 看到的完全相同的图像
我会回来看看是否可以提供更多帮助,但请加入 tesseract 邮件列表,他们真的很有帮助。
旁注 - 我有一些 pytesseract 补丁,我应该发布这些补丁,以便通过 API 获取字符、置信度和单词(这在几个月前是不可能的)。喊他们是否有用。
关于python - 提高多段落扫描的 OCR 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655645/