Python 提高多段扫描的OCR性能

Python 提高多段扫描的OCR性能,python,ocr,tesseract,Python,Ocr,Tesseract,我正在做一个项目,涉及提取以PDF格式存储的科学论文文本。对于大多数论文来说,使用PDFMiner可以很容易地实现这一点,但一些较旧的论文将文本存储为大图像。本质上,一张纸被扫描,图像文件(通常是PNG或JPEG)构成了整个页面 我尝试通过Tesseract引擎的绑定使用它,但结果非常令人失望 在深入探讨我对这个库的问题之前,我想说的是,我对OCR库的建议持开放态度。似乎很少有本机python解决方案 是一个这样的图像(JPEG),我试图提取文本。我在上面链接到的python tesseract

我正在做一个项目,涉及提取以PDF格式存储的科学论文文本。对于大多数论文来说,使用PDFMiner可以很容易地实现这一点,但一些较旧的论文将文本存储为大图像。本质上,一张纸被扫描,图像文件(通常是PNG或JPEG)构成了整个页面

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

在深入探讨我对这个库的问题之前,我想说的是,我对OCR库的建议持开放态度。似乎很少有本机python解决方案

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

是我尝试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
    
    这是另一个代码(在这个问题中没有显示其结果,尽管性能似乎非常相似)


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

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

    • 在自动化之前,从命令行的tesseract开始
    • 如果可能,请限制您的字符集(例如查看/usr/local/share/tessdata/configs at./digits-将其配置为英文字符大写/小写等),并将其作为命令行参数提供
    • 仅使用PNG或TIFF图像(旧版本为TIFF),因为JPG引入了人工制品
    • 向上采样图像,使文本大于当前的小字体。Tesseract lines>10个像素高的字符(如果内存可用的话),对于小字符,它的性能肯定会更差
    • 如果您已经是双层的,则无需进行阈值化,但这样做不会造成伤害,并且您可以看到与tesseract完全相同的图像
    我会回来看看我是否能提供更多帮助,但是加入tesseract邮件列表,他们真的很有帮助


    旁注-我有一些PyteSeract的补丁,我应该发布这些补丁,以便通过API获取角色、信任和文字(几个月前是不可能的)。如果它们可能有用,请大声呼喊。

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

    顺便说一句,我是python tesseract的所有者。如果你想问问题,你可以随时把你的问题转发给我


    Ozvald,非常好的建议,谢谢!我很想看看你的代码。你有github存储库或其他什么吗?关于图像文件类型,是否可以将JPEG图像转换为PNG,或者是否已经造成损坏?我问这个问题是因为我遇到的许多PDF文件在内部都是以JPEG格式存储图像的,所以如果问题是有损压缩,那么我就有点受不了了。没有github repo,给我发封邮件(ian在ianozsvald com),我会把它挖出来(我真的很想去github it…).如果它已经是JPEG格式,那么我会将它保存为TIFF格式,以避免添加任何额外的人工制品。添加额外的噪声是您想要避免的。至于上采样(来自您的reddit线程问题)-这只是为了使tesseract的字体更大,因为tesseract正在努力处理小字体。只需将图像大小增加一倍(无需平滑,无需去噪,只需将两个维度的像素nbr增加一倍),然后重试,结果应该会更好。四处玩耍,寻找一个甜蜜的地方。我们为客户从横幅广告中提取文本,我们必须对横幅广告2-3*进行采样,否则tesseract非常脆弱。再次感谢您的帮助。我会马上给你发电子邮件,并着手实施你的建议。非常感谢你的澄清。我真想知道opencv是从哪里来的!我会向你转达我的任何问题,谢谢!
    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()