23

我正在开展一个项目,该项目涉及提取以 PDF 格式存储的文本科学论文。对于大多数论文,使用 PDFMiner 很容易完成,但一些较旧的论文将其文本存储为大图像。本质上,扫描一张纸,该图像文件(通常是 PNG 或 JPEG)包含整个页面。

我尝试通过它的python-tesseract绑定使用 Tesseract 引擎,但结果非常令人失望。

在深入探讨我对这个库的问题之前,我想提一下,我愿意接受有关 OCR 库的建议。似乎很少有原生的 python 解决方案。

是我试图提取文本的一张这样的图像(JPEG)。我在上面链接到的 python-tesseract google 代码页上的示例片段中提供的确切代码。我应该提到文档有点稀疏,所以很可能我的代码中的许多选项之一配置错误。任何建议(或深入教程的链接)将不胜感激。

是我尝试 OCR 的输出。

我的问题如下:

  1. 我正在使用的代码中是否有任何不理想的地方?有没有更好的方法来做到这一点?也许是一个不同的图书馆?
  2. 我可以执行什么样的预处理来改进检测?这些图像都是黑白的,但我是否应该设置一个阈值并将其上方的任何内容设置为单值黑色,并将其下方的所有内容设置为空值白色?还要别的吗?
  3. 一个更具体的问题:可以通过对单个单词执行 OCR 来提高性能吗?如果是这样,任何人都可以建议一种方法来分隔图像文件中的单个单词(例如:上面链接的那个)并将它们提取到可以独立处理的单独图像中吗?
  4. 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()

谁能解释这两个片段之间的区别?

4

2 回答 2

12

如果您稍微修改一下,Tesseract 在干净的输入文本(如您的示例)上非常好。一些建议:

  • 在自动化之前,在命令行开始使用 tesseract
  • 如果可能,限制您的字符集(例如,查看 /usr/local/share/tessdata/configs 的 ./digits - 将其配置为英文字符大/小写等)并将其作为命令行参数提供
  • 仅使用 PNG 或 TIFF 图像(旧版本为 TIFF),因为 JPG 会引入伪影
  • 对图像进行上采样,使您的文本大于当前的小字体。Tesseract 行 > 10 像素高的字符(如果有记忆的话),对于小字符,它的性能肯定会更差
  • 如果您已经是双层,则无需进行阈值处理,但这样做不会有任何伤害,并且您可以看到与 tesseract 将看到的完全相同的图像

我会回来看看我是否可以提供更多帮助,但请加入 tesseract 邮件列表,它们真的很有帮助。

旁注 - 我有一些 pytesseract 补丁,我应该发布这些补丁,以便通过 API 获取字符、置信度和单词(这在几个月前是不可能的)。喊他们是否有用。

于 2012-07-26T22:20:28.333 回答
6

第一个示例将文件作为缓冲区读取,然后将其中继到 tesseract-ocr 而不进行任何修改,而第二个示例将文件读取为 opencv 格式,这将允许您进行一些图像修饰,例如更改纵横比、灰度和等使用 cv 库。如果您想在将图像传递给 tesseract 之前进行图像处理,则第二种方法非常有用。

顺便说一句,我是 python-tesseract 的所有者。如果您想提问,您可以随时将您的问题转发到http://code.google.com/p/python-tesseract

于 2012-08-13T17:55:11.590 回答