提高多段落扫描的 OCR 性能
Posted
技术标签:
【中文标题】提高多段落扫描的 OCR 性能【英文标题】:Improving OCR performance on multi-paragraph scans 【发布时间】:2012-07-24 05:36:37 【问题描述】:我正在开展一个项目,该项目涉及提取以 PDF 格式存储的文本科学论文。对于大多数论文来说,使用 PDFMiner 很容易做到这一点,但一些较旧的论文将其文本存储为大图像。本质上,扫描一张纸,该图像文件(通常是 PNG 或 JPEG)构成整个页面。
我尝试通过 python-tesseract 绑定使用 Tesseract 引擎,但结果非常令人失望。
在深入探讨我对这个库的疑问之前,我想提一下,我愿意接受有关 OCR 库的建议。似乎没有什么原生的python解决方案。
Here 是我试图在其上提取文本的一张这样的图像 (JPEG)。我在上面链接到的 python-tesseract google 代码页上的示例 sn-ps 中提供的确切代码。我应该提到文档有点稀疏,所以很可能我的代码中的许多选项之一配置错误。任何建议(或深入教程的链接)将不胜感激。
Here 是我尝试 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
这是替代代码(其结果未显示在此问题中,尽管性能似乎非常相似)。
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()
谁能解释这两个sn-ps之间的区别?
【问题讨论】:
【参考方案1】:如果您稍微修改一下,Tesseract 在干净的输入文本(如您的示例)上非常好。一些建议:
在自动化之前,在命令行从 tesseract 开始 尽可能限制您的字符集(例如,查看 /usr/local/share/tessdata/configs 中的 ./digits - 将其配置为大写/小写英文字符等)并将其作为命令行参数提供 仅使用 PNG 或 TIFF 图像(旧版本为 TIFF),因为 JPG 会引入伪影 对图像进行上采样,使文本大于当前的小字体。 Tesseract 行 >10 像素高的字符(如果没有记错的话),对于小字符,它的性能肯定会更差 如果您已经是双层,则无需进行阈值处理,但这样做不会有任何影响,并且您可以看到与 tesseract 将看到的完全相同的图像我会回来看看是否可以提供更多帮助,但请加入 tesseract 邮件列表,他们真的很有帮助。
旁注 - 我有一些 pytesseract 补丁,我应该发布这些补丁,以便通过 API 获取字符、置信度和单词(这在几个月前是不可能的)。喊他们是否有用。
【讨论】:
Ozvald,很棒的建议,谢谢!我真的很想看看你的代码。你有 github 存储库之类的吗?关于图像文件类型,将JPEG图像转换为PNG是否可以接受,或者损坏已经造成?我问是因为我遇到的许多 PDF 在内部将图像存储为 JPEG,所以如果问题是有损压缩之一,那么我有点坚持我所拥有的。 没有 github repo,给我发邮件(ian at ianozsvald com),我会去挖掘它(我真的去 github 它...)。 如果它已经是 JPEG,那么我将它保存为 TIFF 以避免添加任何 extra 人工制品。添加额外的噪音是您想要避免的。 至于上采样(来自您的 reddit-thread 问题) - 这只是为了使 tesseract 的字体更大,因为 tesseract 与小字体作斗争。只需将图像尺寸加倍(不平滑,不去噪,只需将两个维度的像素数加倍)再试一次,结果应该会更好。到处玩耍以找到一个甜蜜点。我们为客户从横幅广告中提取文本,我们必须对横幅广告进行 umsample 2-3* 否则 tesseract 非常不稳定。 再次感谢您的帮助。我会立即给您发送电子邮件并着手实施您的建议。【参考方案2】:第一个示例将文件作为缓冲区读取,然后将其中继到 tesseract-ocr 而不进行任何修改,而第二个示例将文件读取为 opencv 格式,这将允许您进行一些图像修饰,例如更改纵横比,灰度等使用 cv 库。如果您想在将图像传递给 tesseract 之前进行图像处理,则第二种方法非常有用。
顺便说一句,我是 python-tesseract 的所有者。如果你想问问题,你可以随时将你的问题转发到http://code.google.com/p/python-tesseract
乔
【讨论】:
非常感谢您的澄清。我实际上想知道opencv是从哪里来的!有什么问题我都会转给你的,谢谢!以上是关于提高多段落扫描的 OCR 性能的主要内容,如果未能解决你的问题,请参考以下文章