提高多段扫描的OCR性能

blz*_*blz 22 python ocr tesseract

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

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

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

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

是我尝试OCR的输出.

我的问题如下:

  1. 我正在使用的代码中有什么不是最理想的吗?有没有更好的方法呢?也许是另一个图书馆?
  2. 我可以执行哪种预处理来改善检测?这些图像都是B&W,但是我应该设置一个阈值并将其上方的任何内容设置为单值黑色,并将其下方的所有内容设置为空值白色?还要别的吗?
  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
Run Code Online (Sandbox Code Playgroud)

这里是替代代码(其结果未在此问题中显示,尽管性能似乎非常相似).

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()
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这两个片段之间的差异吗?

Ian*_*ald 12

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

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

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

旁注 - 我有一些pytesseract的补丁我应该发布,以通过API获取字符和信心和单词(几个月前不可能).如果他们可能有用,请喊.


小智 6

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

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