提高多段落扫描的OCR性能

23
我正在处理一个项目,需要从存储为PDF格式的科学论文中提取文本。对于大多数论文,使用PDFMiner很容易完成,但一些旧的论文将它们的文本存储为大图像。实质上,一篇论文被扫描并且该图像文件(通常是PNG或JPEG)组成整个页面。
我尝试使用Tesseract引擎通过其python-tesseract绑定,但结果令人失望。
在深入研究我对这个库的问题之前,我想提到我对OCR库的建议持开放态度。似乎很少有原生的Python解决方案。 此处是我正在尝试提取文本的一个这样的图像(JPEG)。我使用了我链接到的python-tesseract谷歌代码页面上的示例片段中提供的确切代码。我应该提到文档有点稀少,所以我的代码中的许多选项可能配置不正确。任何建议(或深入教程的链接)都将不胜感激。

这里是我尝试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()

请问有人能解释一下这两个片段之间的区别吗?

2个回答

12

Tesseract在处理清晰的输入文本方面非常出色(像您的示例),如果您稍加调整。以下是一些建议:

  • 在自动化之前,从命令行开始使用Tesseract
  • 尽可能限制字符集(例如,查看 /usr/local/share/tessdata/configs 中的 ./digits - 为英文字符、大小写字母等进行配置),并将其作为命令行参数提供
  • 仅使用PNG或TIFF图像(对于旧版本,请使用TIFF),因为JPG会引入伪影
  • 将图像升采样,使得文本比当前微小的字体更大。Tesseract处理大于10像素高的字符(如果我没记错的话),它处理微小字符的表现一定更差。
  • 如果您已经是二值化的,则不需要进行阈值处理,但是如果您这样做并且可以看到与Tesseract将要识别的完全相同的图像,那么这样做也无妨

我会回来查看是否还能提供帮助,但请加入Tesseract邮件列表,他们非常有帮助。

附注 - 我有一些针对pytesseract的补丁,可以通过API获取字符、可信度和单词(几个月前还不可能)。如果可能有用,请告诉我。


Ozvald,非常感谢您的宝贵建议!我很想查看您的代码。您是否有GitHub存储库或其他类似的东西?关于图像文件类型,将JPEG图像转换为PNG格式是否可行,还是已经造成了损坏?我之所以问这个问题,是因为我遇到的许多PDF文件在内部存储图像时都使用JPEG格式,因此如果问题是有损压缩的话,那么我就只能接受现状了。 - Louis Thibault
1
没有GitHub仓库,请发送邮件至(ian@ianozsvald.com),我会找到它(我确实应该将其放在GitHub上...)。 - Ian Ozsvald
如果它已经是JPEG格式,那么我会将其保存为TIFF格式,以避免添加任何额外的伪影。添加额外的噪点是要避免的。 - Ian Ozsvald
关于上采样(来自您在Reddit帖子中的问题)- 它只是为了使Tesseract更容易处理小字体而将字体放大。只需将图像大小加倍(不进行平滑处理,不去噪声,只需在两个维度中加倍像素数),然后再试一次,结果应该会更好。尝试找到最佳效果。我们为客户从横幅广告中提取文本,我们必须将横幅广告上采样2-3倍,否则Tesseract会非常不稳定。 - Ian Ozsvald
非常感谢您的帮助。我会立即给您发送电子邮件,并开始实施您的建议。 - Louis Thibault
@IanOzsvald pytesser和python-tesseract是不同的吗? - samkhan13

6
第一个例子将文件读取为缓冲区,然后将其传递给tesseract-ocr,而不进行任何修改,而第二个例子将文件读取到opencv格式中,这将允许您使用cv库进行一些图像处理,例如更改纵横比,灰度等。如果您想在将图像传递给tesseract之前进行图像操作,则第二种方法非常有用。
顺便说一下,我是python-tesseract的所有者。如果您有问题,欢迎将您的问题转发到http://code.google.com/p/python-tesseract

非常感谢您的澄清。我实际上想知道OpenCV在这里起了什么作用!我会把任何问题转发给您,谢谢! - Louis Thibault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接