提高多段扫描的OCR性能

时间:2012-07-25 17:50:52

标签: python ocr tesseract

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

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

在深入研究我对这个库的问题之前,我想提一下我对OCR库的建议持开放态度。似乎很少有原生的python解决方案。

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

Here是我尝试OCR的输出。

我的问题如下:

  1. 我使用的代码中有什么不是最理想的吗?有没有更好的方法呢?也许是一个不同的图书馆?
  2. 我可以执行哪种预处理来改善检测?这些图像都是B& W,但是我应该设置一个阈值并将其上方的任何内容设置为单值黑色,并将其下方的所有内容设置为空值白色?还有什么吗?
  3. 一个更具体的问题:通过对单个单词执行OCR可以提高性能吗?如果是这样,任何人都可以建议一种方法来分隔图像文件中的单个单词(例如:上面链接的单词)并将它们提取到可以独立处理的单独图像中吗?
  4. PDF页面图像中嵌入的图形和其他图像是否会干扰OCR?我应该删除这些吗?如果是这样,有人可以建议一种自动删除它们的方法吗?
  5. 修改 为简单起见,这是我使用的代码。

    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 个答案:

答案 0 :(得分:12)

如果你修补一下,Tesseract对干净的输入文本非常好(就像你的例子)。一些建议:

  • 在自动化之前,请从命令行开始使用tesseract
  • 如果可能,请限制您的字符集(例如,查看/ usr / local / share / tessdata / configs at ./digits - 将其配置为英文字符大写/小写等)并将其作为命令行参数提供< / LI>
  • 仅使用PNG或TIFF图像(旧版本的TIFF),因为JPG引入了人工制品
  • 对图像进行采样,使您的文字大于当前的小字体。 Tesseract线条> 10个像素高的字符(如果内存服务),它确实在微小字符中表现更差
  • 如果你已经是双级别,则无需进行阈值处理,但是如果你这样做就不会受到影响,你可以看到与tesseract看到的完全相同的图像

我会回到这里查看我是否可以提供更多帮助但是加入tesseract邮件列表,他们真的很有帮助。

旁注 - 我有一些pytesseract补丁,我应该发布这些补丁来获取角色和信心和通过API的话(几个月前不可能)。如果他们可能有用,请大喊。

答案 1 :(得分:6)

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

是的,我是python-tesseract的所有者。如果您想提问,可以随时欢迎将问题转发给http://code.google.com/p/python-tesseract