文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别。Tesseract是一个用于文字识别的工具。
https://digi.bib.uni-mannheim.de/tesseract/
在上述链接下载自己需要的版本。下载后安装,并设置全局变量。
命令行运行tesseract -v,如果和下图一样即安装成功。
Tesseract默认是不支持中文的,如果想要识别中文或者其它语言需要下载相应的语言包。下载地址如下:https://tesseract-ocr.github.io/tessdoc/Data-Files ,进入网站后我们往下翻
其中有两个中文语言包,一个Chinese-Simplified和Chinese-Traditional,它们分别是简体中文和繁体中文,我们选择需要的下载即可。下载完成后我们需要放到Tesseract的路径下的tessdata目录下。
pytesseract是一款用于光学字符识别(OCR)的python工具,能够识别图片上的数字、英文和中文等。
pytesseract是对Tesseract-OCR的一层封装,同时也可以单独作为对Tesseract引擎的调用脚本,支持使用PIL库(Python Imaging Library)读取各种图片文件类型,包括jpeg、png、gif、bmp、tiff等其它格式。作为脚本使用时,pytesseract将打印识别出的文字,而不是将其写入文件。
Tesseract-OCR是由HP实验室开发由Google维护的开源OCR(Optical Character Recognition,光学字符识别)引擎。可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。
用于文字识别:
pip install pytesseract
用于图片读取:
pip install Pillow
识别文字的方法:
image_to_string(image, lang=None, boxes=False, config=None)
示例如下:
import pytesseract
from PIL import Image
# 读取图片
im = Image.open('sentence.jpg')
# 识别文字
string = pytesseract.image_to_string(im)
print(string)
若需识别中文,需要设置lang='chi_sim'
import pytesseract
from PIL import Image
# 读取图片
im = Image.open('sentence.png')
# 识别文字,并指定语言
string = pytesseract.image_to_string(im, lang='chi_sim')
print(string)
import os
# 文字图片的路径
path = 'text_img/'
# 获取图片路径列表
imgs = [path + i for i in os.listdir(path)]
# 打开文件
f = open('text.txt', 'w+', encoding='utf-8')
# 将各个图片的路径写入text.txt文件当中
for img in imgs:
f.write(img + '\n')
# 关闭文件
f.close()
import pytesseract
# 识别文字
string = pytesseract.image_to_string('text.txt', lang='chi_sim')
print(string)
Python中OCR第三方库非常多,比如easyocr、PaddleOCR、cnocr等等。
EasyOCR检测部分使用CRAFT算法,识别模型为CRNN,由3个组件组成:特征提取Resnet、序列标记LSTM、解码CTC。整个深度学习过程基于pytorch实现。
图片–预处理(去噪、色彩饱和度、尖锐处理等)–文字检测(CRAFT)–中间处理(倾斜处理等)—文字识别—后续处理—输出结果
在官网https://pytorch.org/中找到操作系统对应的安装方法
pip3 install torch torchvision torchaudio
pip install easyocr
安装完成后,可以通过easyocr.__version__
查看版本号
3. 安装检测模型、识别模型(语言包)
https://www.jaided.ai/easyocr/modelhub/
下载文本检测模型:
下载识别模型,识别模型对应了各种语言包,下图是简体中文和英文的识别模型:
将下载的模型文件解压后拷贝到用户目录的.EasyOCR\model文件夹下。
【注】这里下载的识别模型(语言包)的文件名称和后面看到的语言类型并不是完全对应的,比如在代码中的语言类型ch_sim对应简体中文(zh_sim_g2),en对应英文(english_g2)。
第1步创建Reader()实例,第2步用readtxt()方法检测和识别。
参数如下:
参数详解:
示例:
import easyocr
reader = easyocr.Reader(
lang_list=['ch_sim', 'en'], # 需要导入的语言识别模型,可以传入多个语言模型,其中英语模型en可以与其他语言共同使用
gpu=False, # 默认为True
download_enabled=True # 默认为True,如果 EasyOCR 无法找到模型文件,则启用下载
)
result = reader.readtext('id_card.jpg', detail=1 ) # 图片可以传入图片路径、也可以传入图片链接。但推荐传入图片路径,会提高识别速度。包含中文会出错。设置detail=0可以简化输出结果,默认为1
print(result)
结果如下:readtext 返回的列表中,每个元素都是一个元组,内含三个信息:位置、文字、置信度:
[
([[27, 37], [341, 37], [341, 79], [27, 79]], '姓 名 爱新觉罗 。玄烨', 0.6958897643232619),
([[29, 99], [157, 99], [157, 135], [29, 135]], '性 别 男', 0.914532774041559),
([[180, 95], [284, 95], [284, 131], [180, 131]], '民蔟满', 0.4622474180193509),
([[30, 152], [94, 152], [94, 182], [30, 182]], '出 生', 0.6015505790710449),
([[110, 152], [344, 152], [344, 184], [110, 184]], '1654 年54日', 0.42167866223467815),
([[29, 205], [421, 205], [421, 243], [29, 243]], '住 址 北京市东城区景山前街4号', 0.6362530289101117),
([[105, 251], [267, 251], [267, 287], [105, 287]], '紫禁城乾清宫', 0.8425745057905053),
([[32, 346], [200, 346], [200, 378], [32, 378]], '公民身份证号码', 0.22538012770296922),
([[218, 348], [566, 348], [566, 376], [218, 376]], '000003165405049842', 0.902066405195785)
]
若:detail=0
,从而只返回文字内容:
['姓 名 爱新觉罗 。玄烨', '性 别 男', '民蔟满', '出 生', '1654 年54日', '住 址 北京市东城区景山前街4号', '紫禁城 乾清宫', '公民身份证号码', '000003165405049842']
若识别率不高,则可对图片进行一些处理,可参照如下:
cv2.pyrMeanShiftFiltering(src, dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria)
原理:meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为中心继续执行上述迭代过程,直至最终收敛。可以利用均值偏移算法的这个特性,实现彩色图像分割.