Python文字识别就这么简单-对比pillow,wandTesseract的使用

今天我们来说一下,如何使用python识别PDF中的文字。今天,我们用Python3, pillow, wand和三个python包,分别是Tesseract下的:textract,pytesseractpyocr

下面的内容,同样也适用于普通文本,但是这货识别结果不是百分百准确,所以后期不要忘记仔细检查它。

更高层次的识别或者说是更人性化的代码实现,我们放在下一期文章,这篇文章我们先来简单的进阶,并且我们会对比一下这几个识别模块的效率怎么样。

Python文字识别就这么简单-对比pillow,wandTesseract的使用

开始识别之前,我们可以准备一份PDF文档,然后转换为图片格式。

主要是除了textract之外,都不能使用pdf格式,所以我们应该将pdf文件转换为图像(jpg)。我们将使用wand这个类库。

from wand.image import Image as Img
with Img(filename='file_name.pdf', resolution=300) as img:
 img.compression_quality = 99
 img.save(filename='image_name.jpg')

现在我们可以使用包装器将新图像放到OCR中,然后使用regexp或其他任何文本工具(例如NLTK)查找所需的数字。但是这种方式有点白搭...

比较好的方法是你可以用一些绘图工具比如PS剪裁一下。

然后我们裁剪大图,然后提取里面的小图:

from PIL import Image
img = Image.open('image_name.jpg')
crop_img = img.crop((x1, y1, x2, y2))
crop_img.save('amount.jpg')

返回结果:

Python文字识别就这么简单-对比pillow,wandTesseract的使用

好的,现在我们可以开始识别我们的图像了。别忘了,只有textract可以打开图像,另一个需要使用pillow.

测试效果:

用textract识别:

import textract
text = textract.process('image.jpg', encoding='ascii', method='tesseract')

返回结果:

{'3rd Image': b'0.130

',
'1st Image': b'4.433

',
'4th Image': b'1M0

',
'5th Image': b'DJUG

',
'2nd Image': b''}

用pytesseract识别:

from PIL import Imageimport pytesseract
text = pytesseract.image_to_string(Image.open('image.jpg'))

返回结果:

{'5th Image': '0.00',
'3rd Image': '0.00',
'1st Image': '4.03',
'4th Image': '1W',
'2nd Image': ''}

用pytesseract识别:

import pyocrimport pyocr.buildersfrom PIL import Image
tools = pyocr.get_available_tools()[0]
text = tools.image_to_string(Image.open(image), builder=pyocr.builders.DigitBuilder())

返回结果:

{'4th Image': '1 300',
'1st Image': '4.03',
'2nd Image': '',
'3rd Image': '0.00',
'5th Image': '0.00'}

额...看起来效果不是很好,或者说有些残酷。识别率太低,为什么呢?会不会问题出在我们的图片上呢?

Python文字识别就这么简单-对比pillow,wandTesseract的使用

还真是,如果你们要从pdf文件中缩放提取的图像,你们会在图像中看到很多噪点。要解决这个问题,我们可以尝试将图像转换为单色模式(灰度):

from PIL import Image
img = Image.open('image.jpg')img = img.convert('L')img.save('image.jpg')

然后….

Python文字识别就这么简单-对比pillow,wandTesseract的使用

看吧这个看起来好多了,我们重新运行来测试。

返回结果:

{'3rd Image': b'0.00

',
'5th Image': b'0.00

',
'4th Image': b'1000

',
'1st Image': b'4.03

',
'2nd Image': b''}

Pytesseract:

{'1st Image': '4.03',
'4th Image': '1000',
'5th Image': '0.00',
'2nd Image': '',
'3rd Image': '0.00'}

Pyocr:

{'5th Image': '0.00',
'3rd Image': '0.00',
'2nd Image': '',
'4th Image': '1000',
'1st Image': '4.03'}

所以,在这种情况下,除第二张图像外,所有的模块返回的数据都很准确。

Python文字识别就这么简单-对比pillow,wandTesseract的使用

总结:

Textract:Textract是一个很有前途的类库。它可以从pdf,gif,docx,png,jpg等中提取数据。但是这个包只能用于简单的pdf文件(没有表格,很多列等),而且这个包比较大(大约30mb左右)

Pytesseract:中规中矩的识别库,但没什么特别的。

Pyocr:很好用,具有更多功能的python包,比如你可以设置要识别的数据(句子,单词,数字等),可以使用Tesseract或Cuneiform,进行方向检测等等。

相关推荐