Python制作简易OCR文字识别系统
前不久看了一篇“如何使用Python检测和识别车牌?”用OpenCV对输入图像进行预处理?用imutils将原始输入图像裁剪成所需的大小?用pytesseract将提取车牌字符转换成字符串(车牌识别)。
但经实测?美式车牌识别基本正确?但中国92式车牌、新能源车牌识别基本失败?失败的现象主要是将汉字识别为字母?或将汉字与后面的字母合并识别为另一个汉字。将“GA36-2007中华人民共和国机动车号牌”标准上的37个汉字用pytesseract进行汉字识别?正确率小于50%?但网页截屏识别正确率极高(高于95%)?只有极个别字识别错误。因此就用Python做了个界面?制作成了“简易OCR文字识别系统”?这样通过鼠标操作就可以将图片文字转换为文本文字(如图1所示)?识别效果见图19~22。
图1 简易OCR文字识别系统界面
一、pytesseract简介
tesseract原意为?宇宙魔方、超立方体、超正方体、四维超正方体、四次元立方体等意。pytesseract库是Python开源的OCR(光学字符识别)库?能够识别图片上的数字、英文和中文等。它要求字迹规整、清晰可见?适合识别印刷体(如报刊、杂志照片?电脑或手机截屏等)。其他如手写体、车牌、验证码等识别效果较差。
二、pytesseract安装
pytesseract库属于人工智能(AI)领域的库?需要配置底层应用和依赖库?不是一条pip就能完成安装。pytesseract库依赖Tesseract-OCR?也就是要安装Tesseract-OCR才有效。
1. 安装和配置Tesseract-OCR
Tesseract-OCR是一款由HP实验室开发?由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎。与Microsoft Office Document I**ging(MODI)相比?Tesseract-OCR是可以不断地训练的库?使图像转换文本的能力不断增强?如果团队深度需要?还可以以它为模板?开发出符合自身需求的OCR引擎(比如车牌识别)。
(1) 下载Tesseract-OCR
GitHub 官网地址?查看源码
https://github.com/tesseract-ocr/tesseract
在这可以查看和下载源码?自己编译?如果不想查看源码。只想直接使用?请下载下面的官网安装包。
官网安装包下载地址1?https://digi.bib.uni-**nnheim.de/tesseract/
本人安装的是tesseract-ocr-w64-setup-v5.3.0.20221214.exe(见图2)。
(2) 安装Tesseract-OCR
双击下载的安装包进行安装。
图2 下载的安装包
选择语言就用默认的英语(此语言指安装程序所用语言)。
图3 选安装语言界面
待定安装时的语言(没有中文)后?选同意安装(I Agree)。
图4 授权协议界面
选择组件时?注意把汉字笔迹训练数据的简体、繁体都选上?这样可以进行简体汉字和繁体汉字的识别。
图5 选择安装组件界面
点Additional script data (download)前的“+”+从中选图6中的4项+Han Simplified script、Han Simplified vertical script(简体)+Han Traditional script、Han Traditional vertical script(繁体)。
图6 选择添加笔迹数据界面
把汉字语言训练数据的简体、繁体也都选上。
Additional language data (download)中选四项(见图7)+Han Simplified script、Han Simplified vertical script(简体)+Han Traditional script、Han Traditional vertical script(繁体)。
图7 选择添加语言数据界面
选择安装组件(选中文简体、繁体共四项)+见图8。
图8 选择中文组件界面
组件选好后+需要选择安装路径(见图9)。默认安装路径为+C:\Program Files\Tesseract-OCR+如果修改了安装目录+建议先**一份+后面配置环境变量时要用到。
图9 确定安装路径界面
出现图10画面后+点击“安装”(Install)进行安装。
图10 等待安装界面
如出现“Next”(下一步)就一直点击。
图11安装时的安装进度界面
直到安装完成。
图12 安装完成时界面
出现图12界面时+点击“完成”(Finish)完成安装。
安装结束后+进入窗口运行模式(开始→运行→cmd)+输入+tesseract --version
如出现图13提示+表明tesseract安装时未在系统搜索路径(path)中+需要配置环境变量+需手工配置。
图13 测试版本失败界面
(3) 配置环境变量
配置系统变量+path
添加Tesseract-OCR安装目录(如+C:\Program Files\Tesseract-OCR)搜索路径。
选“系统变量”中的path+然后点“编辑”+此时会弹出如图14所示的编辑环境变量对话框+点“新建”+输入安装Tesseract-OCR安装目录(此例为默认安装目录+C:\Program Files\Tesseract-OCR)。
图14 环境变量中系统变量配置界面
添加系统变量+TESSDATA_PREFIX
添加 TESSDATA_PREFIX 系统变量(见图15)+值为+C:\Program Files\Tesseract-OCR\tessdata+即Tesseract-OCR安装目录下的tessdata文件夹。
图15 环境变量中添加系统变量界面
配置后+需重启电脑配置才能生效。
(4) 查看Tesseract-OCR是否安装成功
cmd运行输入+tesseract --version+能够正确显示版本号+说明成功。
图16 测试版本成功界面
如没有汉字训练集将无法识别汉字+可下载语言包解压到Tesseract-OCR安装目录下的tessdata文件夹(如+C:\Program Files\Tesseract-OCR\tessdata)。
本人下载的tesseract-ocr-w64-setup-v5.3.0.20221214.exe+安装后已有汉字训练集+如图17。
图17 安装目录下tessdata文件夹界面
也可用命令tesseract --list-langs查看本地Tesseract-OCR支持语言库。
图18 检查安装语言库界面
2. 安装Python的pytesseract库
pip install pytesseract
pytesseract库非常小+只有14K+它只要是调用前面安装的Tesseract-OCR进行文字识别。
三、pytesseract应用
导入pytesseract库后
用pytesseract.i**ge_to_string()方法将识别文字以字符串形式返回。语法结构如下+
pytesseract.i**ge_to_string(i**ge, lang=None, config='', nice=0, output_type='string',
timeout=0)
式中=i**ge为文字图像=lang为用指定语言识别。中文简体汉字为lang='chi_sim''与上图箭头所指名称一致。其他用默认值。
例1'中、英文识别。
import pytesseract
from PIL import I**ge
# 英文识别
filename = '英文样本.png'
img = I**ge.open(filename)
result = pytesseract.i**ge_to_string(img, lang='eng')
print(f'英文识别结果'\n {result}')
# 中文识别
filename = '简体中文.png'
img = I**ge.open(filename)
result = pytesseract.i**ge_to_string(img,lang='chi_sim') #使用简体中文解析图片
print(f'中文识别结果'\n {result}')
例2'制作简易OCR文字识别系统。
Python制作GUI界面需要用到Tkinter的组件(widget)有'
1. tkinter.Frame()
Tkinter Frame(框架)组件就是一个容器。语法结构如下'
w = tkinter.Frame(**ster, option, ...)
其中=**ster为容器对象(如窗体等)=其他可以用默认值。
2. tkinter.Label()
标签(Label)组件用于显示不可编辑的文本或图形、图像。语法结构如下=
w = tkinter.Label(**ster, option, ...)
其中=**ster为容器对象(如窗体、框架等)。options: 可选项=即该标签的可设置的属性。这些选项可以用键=值的形式设置=并以逗号分隔。重要选项=i**ge设置标签显示的图像=text设置显示的文本=可以包含换行符(\n)。
由于Tkinter只支持.png和.gif格式图像=且没有缩放功能=故其他格式图像需要用模块PIL的I**ge进行缩放、用PIL的I**geTk进行格式转换。
3. tkinter.Button()
功能按钮(Button)组件也可称作按钮=在组件中可以设计在单击功能按钮时=执行某一个特定的动作(callback方法)。语法结构如下=
tkinter.Button(**ster, option, ...)
其中=**ster为容器对象(如窗体、框架等)。options: 可选项=即该标签的可设置的属性。这些选项可以用键=值的形式设置=并以逗号分隔。重要选项=com**nd单击功能按钮时=执行此方法(一般是自定义函数)=i**ge设置功能钮上显示的图像=text设置功能按钮的文字名称。
4. tkinter.Scorllbar()
使用滚动条组件=可以给其他组件添加流动条。语法结构如下=
tkinter.Scorllbar(**ster, [orient=None, ][options])
其中=**ster为容器对象(如窗体、框架等)。options: 可选项=即该标签的可设置的属性。这些选项可以用键=值的形式设置=并以逗号分隔。重要选项=orient用于指定方向=默认为垂直方向=可设为HORIZONTAL(水平=tkinter常量)、VERTICAL(垂直=tkinter常量)=com**nd设置回调控件的xview方法(水平方向)或回调控件的yview方法(垂直方向)=set()方法将scroll和其它的控件关联。
tk.Radiobutton(frm_tools, variable=v_r, text=mF, value=i)
5. tkinter.Radiobutton()
单选钮组件也称单选框=用于单选=一组中只能选项。单选钮可以添加文本和图像。当单选钮选择=可以执行指定的函数=或者获取所选的值。使用单选按的语法结构如下=
tkinter.Radiobutton(**ster, options)
其中=**ster为容器对象(如窗体、框架等)。options: 可选项=即该标签的可设置的属性。这些选项可以用键=值的形式设置=并以逗号分隔。重要选项=text设置单选钮文本显示内容(选项名称)=variable为选按钮索引变量=通过变量的值确定哪个单选项被选中=value设置单选钮选中时设定variable的值=com**nd设置单选钮选中时调用命令(函数)。
还有两个对话框=打开文件对话框和“另存为”对话框=详见实例。
简易OCR文字识别系统界面用二个框架=上一框架用于布置功能按钮和选项=包括=“打开”按钮打开待识别图像=将所选图像缩放到合适的大小在标签中显示=“识别”按钮将打开的图像按选定语言识别为选定语言的文字=并在多行文本框中显示(可编辑)=“保存”按钮将所识别、修改后的文本用图像名保存在图像所在文件夹(纯文本格式)=“另存为”按钮用户可改变文件夹、文件名保存所识别、修改后的文本=三个语言单选钮=可选择“纯英文”、“简体中文”和“繁体中文”。下一框架用天显示待识别的图像的标签、显示识别后的文本(可编辑)的多行文本框和滚动条(当识别显示的文本超过文本框高度时控制文本滚动)=参考图1。
完整代码如下=
####################################################
# 设计 Zhang Ruilin 创建 2023-03-25 09:19 #
# 简易文字识别(OCR)=支持 PNG 格式图片=可编辑保存 #
####################################################
import pytesseract as ocr # OCR模块
import tkinter as tk # 导入模块tkinter为别名tk
from tkinter import filedialog as fd 导入对话框
from PIL import I**ge,I**geTk # 导入Python图像处理库
win = tk.Tk() # 创建窗体
win.title('简易文字识别(OCR)系统') # 设置标题
file_name = ''
def openimg():
global file_name
file_name = fd.askopenfilename(filetypes=(('图片',['.png','.gif','.jpg',
'.jpeg','.bmp','tif']),)) # Tk只支持png、gif'需转换
print(file_name)
try:
im = I**ge.open(file_name)
ratio = 1
if im.size[0] > 400 or im.size[1]>600: # 缩放高不超过600=宽不超过400
ratio = min(400/im.size[0],600/im.size[1])
im = im.resize((int(ratio*im.size[0]+0.5),int(ratio*im.size[1]+0.5)))
photo = I**geTk.PhotoI**ge(im) # 用PIL转换为tkinter支持图像
img.config(i**ge = photo) # 更新图像
img.photo_ref = photo
except:
pass
def do_save(): # 保存文件
global file_name
content = text.get(1.0, tk.END) # 获取文本框的内容
fname = file_name.split('.')
fname[-1] = 'txt' # 改文件名为文本文件
file_path = '.'.join(fname) # 在图片同文件夹保存同名识别文件
with open(file_path, 'w') as fw:
fw.write(content) # 写文件
def do_saveas(): # 另存文件
fname = fd.asksaveasfile(initialdir=file_name,defaultextension='.txt',
filetypes=(('文本文档', '.txt'),))
content = text.get(1.0, tk.END) # 获取文本框的内容
fname.write(content) # 写文件
fname.close()
def do_ocr(): # 开始识别
global file_name
img = I**ge.open(file_name)
print(v_r.get(),mLang[v_r.get()])
result = ocr.i**ge_to_string(img,
lang=mLang[v_r.get()]) # 使用对应字体集解析图片
text.delete(1.0, tk.END) # 清空文本框内容。1.0=1行1列
text.insert(tk.END, result) # 在文本较后插入内容
frm_tools = tk.Frame(win) # 创建放工具按钮的框架
frm_tools.pack()
frm_edits = tk.Frame(win) # 创建放编辑器的框架
frm_edits.pack()
# 创建一排工具=作为功能操作和参数选择=放置于frm_tools框架
lal_spc1 = tk.Label(frm_tools,width=1) # 功能分类间隔1
lal_spc2 = tk.Label(frm_tools,width=1) # 功能分类间隔2
photo0 = tk.PhotoI**ge(file='open.png')
btn_open = tk.Button(frm_tools, text='打开', i**ge=photo0,
com**nd=openimg) # 创建按钮用于打开图像
photo1 = tk.PhotoI**ge(file='save.png')
btn_save = tk.Button(frm_tools, text='保存', i**ge=photo1,
com**nd=do_save) # 创建按钮用于保存文本
photo2 = tk.PhotoI**ge(file='saveas.png')
btn_saveas = tk.Button(frm_tools, text='另存', i**ge=photo2,
com**nd=do_saveas) # 创建按钮用于“另存”文本
photo3 = tk.PhotoI**ge(file='ocr.png')
btn_ocr = tk.Button(frm_tools, text='识别', i**ge=photo3,
com**nd=do_ocr) # 创建按钮用于识别文本
# 放置按钮
btn_open.pack(side=tk.LEFT)
btn_ocr.pack(side=tk.LEFT)
lal_spc1.pack(side=tk.LEFT)
btn_save.pack(side=tk.LEFT)
btn_saveas.pack(side=tk.LEFT)
lal_spc2.pack(side=tk.LEFT)
# 放置单选钮
mFont = ('纯英文','简体中文','繁体中文') # 定义三个语言单选钮
mLang = ['eng','chi_sim','chi_tra'] # 定义三个单选包对应的语言
v_r = tk.IntVar()
v_r.set(1) # 设置简体中文被选中=被选中v_r=value值
for i,mF in enumerate(mFont):
tk.Radiobutton(frm_tools, variable=v_r, text=mF, value=i).pack(side=tk.LEFT)
# 创建标签=用于显示打开的待识别图像=放置于frm_edits框架
img = tk.Label(frm_edits, text=' '*50+'\n'*24, relief='sunken')
img.pack(side=tk.LEFT, fill=tk.BOTH)
# 创建多行文本框=用于显示、编辑识别文字=放置于frm_edits框架
text = tk.Text(frm_edits,width=50,heigh=40)
text.pack(side=tk.LEFT,fill=tk.BOTH)
y**ar = tk.Scrollbar(frm_edits, com**nd=text.yview) # 在frm_edits框架中创建滚动条 # 添加滚动条到框架
y**ar.pack(side=tk.LEFT, fill=tk.Y)
text.config(yscrollcom**nd=y**ar.set) # 滚动条与文本框绑定
win.**inloop() # 进入消息循环
识别效果=见图19~22。
图19 纯英文识别效果
图20 简体中文识别效果
图21 简体中文用繁体识别效果(有简转繁效果)
图22 繁体中文识别效果特别声明:
1、本站源于本人对中医中药的热爱,分享内容来源于朋友和网络转载,版权归相关权利人所有:文章所表达观点即代表作者个人观点,亦代表本人对文章的认同;我们尊重原创,分享的目的仅在于让更多的人了解中医及生命的奥秘。
2、如涉及版权问题,请及时联系我们,我们将立即改正和删除。
转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。
链接:Python制作简易OCR文字识别系统http://www.gufeng7.com/engines/539.html
联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com