Python文字识别就这么简单-对比pillow,wandTesseract的使用
今天我们来说一下,如何使用python识别PDF中的文字。今天,我们用Python3, pillow, wand和三个python包,分别是Tesseract下的:textract,pytesseract和pyocr。
下面的内容,同样也适用于普通文本,但是这货识别结果不是百分百准确,所以后期不要忘记仔细检查它。
更高层次的识别或者说是更人性化的代码实现,我们放在下一期文章,这篇文章我们先来简单的进阶,并且我们会对比一下这几个识别模块的效率怎么样。
开始识别之前,我们可以准备一份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')
返回结果:
好的,现在我们可以开始识别我们的图像了。别忘了,只有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'}
额...看起来效果不是很好,或者说有些残酷。识别率太低,为什么呢?会不会问题出在我们的图片上呢?
还真是,如果你们要从pdf文件中缩放提取的图像,你们会在图像中看到很多噪点。要解决这个问题,我们可以尝试将图像转换为单色模式(灰度):
from PIL import Image img = Image.open('image.jpg')img = img.convert('L')img.save('image.jpg')
然后….
看吧这个看起来好多了,我们重新运行来测试。
返回结果:
{'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'}
所以,在这种情况下,除第二张图像外,所有的模块返回的数据都很准确。
总结:
Textract:Textract是一个很有前途的类库。它可以从pdf,gif,docx,png,jpg等中提取数据。但是这个包只能用于简单的pdf文件(没有表格,很多列等),而且这个包比较大(大约30mb左右)
Pytesseract:中规中矩的识别库,但没什么特别的。
Pyocr:很好用,具有更多功能的python包,比如你可以设置要识别的数据(句子,单词,数字等),可以使用Tesseract或Cuneiform,进行方向检测等等。