python - 提高多段落扫描的 OCR 性能

标签 python ocr tesseract

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

我尝试通过 python-tesseract 使用 Tesseract 引擎。绑定(bind),但结果相当令人失望。

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

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

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

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

最佳答案

如果您稍微修改一下,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/

相关文章:

android - 适用于 Android 的完美 OCR 扫描

python - 删除列表中满足条件的列表

Android UnsatisfiedLinkError 与 Tesseract 和 OpenCV

python - 类型错误 : no salt specified in flask(about sha256)

python - 将 `__str__` 方法添加到 Boost Python C++ 类时的构建问题

python - 如何识别扫描的 PDF 文件中的图像?

image-processing - 图片很好,但没有来自 OCR 的文本,为什么? Python、Skimage、PIL、Tesseract

ocr - Tesseract OCR 无法识别基本的字母数字代码

java - 如何在 Python pycrypto 中指定 RSA 填充

python - 根据另一列的多个条件填充一列