Python OCR图片识别 OCR picture recognition
作为一门成熟的编程语言,Python自然可以实现OCR识别功能,今天给大家介绍一种最简单的实现方式:EasyOCR。EasyOCR名字中的“easy”一点也不夸张,相信在阅读完笔者今天的介绍以后,你会感叹:OCR图片识别竟然可以如此简单!EasyOCR具有以下特性:
1. 简单
2. 免费
3. 支持识别多种语言
但同时EasyOCR也有以下缺点:
1. 文件路径不支持中文
2. 识别精确度有限
目录
1. 准备工作:安装第三方库
2. 简单实战-提取发票的发票号
3. 进阶-提取文件夹下所有发票号
1. 准备工作:安装第三方库
EasyOCR库依赖于第三方机器学习库,因此要同时安装机器学习相关库torchvision和easyocr:
- 1.torchvision:基于pytorch的图像处理库
pip install torchvision -i https://mirrors.aliyun.com/pypi/simple/
pip install easyocr -i https://mirrors.aliyun.com/pypi/simple/
此外,需要注意的是,这里的OCR识别底层逻辑需要用到numpy库,并且对numpy库的版本有一定要求(<1.23.0,>=1.16.5),假设我们这里安装1.22.0版本的numpy:
pip uninstall numpy #如果安装过需要先卸载之前安装的
pip install numpy==1.22.0 -i https://mirrors.aliyun.com/pypi/simple/
2. 简单实战-提取发票的发票号
首先,我们做个简单的实战——提取一张发票的发票号。
假设我们想要提取如下图所示发票(invoice1)的发票号:![图片](http://image109.360doc.com/DownloadImg/2023/10/1011/273574894_1_20231010114516338.jpeg)
相关代码如下:
import easyocr
import re
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)
results = reader.readtext('G:\gzh-ocr\invoice1.jpg', detail=0) #detail 数值越高信息越详细。
pattern = r'\d+' # 定义正则表达式
print('发票号:', re.findall(pattern, results[3])[0])
运行结果如下:![图片](http://image109.360doc.com/DownloadImg/2023/10/1011/273574894_2_20231010114516416.png)
代码只有惊人的短短四行,就把发票号成功识别了出来!
3. 进阶-提取文件夹下所有发票号
我们做个进阶的实战案例——自动提取指定文件夹下所有发票图片中的发票号。
我们在G盘下的”gzh-ocr”文件夹中有两张发票,图片名称分别是invoice1.jpg和invoice2.jpg(这里是由于素材获取难度大,只放了两张图片,其实我们的程序十分强大,放多少张都能自动全部进行识别提取)。相关素材如下图所示:
invoice1:
invoice2:![图片](http://image109.360doc.com/DownloadImg/2023/10/1011/273574894_4_20231010114516620.jpeg)
完整代码如下:
import easyocr
import re
from pathlib import Path
reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)
for f in Path('G:\gzh-ocr').rglob('*.*'):
if f.suffix.lower() in ['.jpg', '.png']:
results = reader.readtext(str(f), detail=0) #detail 数值越高信息越详细。
pattern = r'\d+' # 定义正则表达式
print('发票名:',f.stem,'发票号:',re.findall(pattern, results[3])[0])
运行结果如下:![图片](http://image109.360doc.com/DownloadImg/2023/10/1011/273574894_5_20231010114516760.png)
可以看到,我们'G:\gzh-ocr'文件夹下的所有发票中的发票号都被成功提取了出来,并且程序十分贴心的加上了发票名!