一:设置白名单:让tesseract-OCR只识别指定内容
有时我们需要用tesseract-ocr只识别指定类型的数据,如:仅识别英文字母或数字。此时可设置白名单,让tesseract-ocr只输出我们需要的结果。
1.打开tesseract-ocr安装路径下的tessdata/configs/digits文件,可以看到里面有一个tessedit_char_whitelist,将其设置成我们需要得到的识别结果。
如:tessedit_char_whitelist ABCD
2.在调用命令时,需要加上我们设置的文件名:tesseract xxx.png outfilename -psm 6 digits
注:
tesseract提供了OCR引擎模式。有如下四种
0 =仅限原始Tesseract
1 =只有神经网络LSTM
2 =Tesseract + LSTM
3 =基于可用的默认值
目前LSTM是无法支持白名单的
我们需要选择第0种模式,指令如下:
tesseract --oem 0 1.png outfileName digits
注意:使用第0种模式会降低识别准确率
二。下载地址:
https://digi.bib.uni-mannheim.de/tesseract/
三。中文包问题
安装过程选择安装中文包失败,并且有些网址失败,需要下面地址和方式下载(不能用迅雷)。下载后chi_sim.traineddata放到安装目录C:\Program Files\Tesseract-OCR\tessdata 下
下载地址:https://github.com/tesseract-ocr/tessdata/blob/master/chi_sim.traineddata
四。命令行介绍
tesseract test.jpg test.txt -l chi_sim+eng -psm 7 --oem 1
-l chi_sim+eng 指定中文字库和英文字库
-psm 7 表示告诉tesseract code.jpg图片是一行文本这个参数可以减少识别错误率. 默认为 3。自己测试好像是一样的
默认的tesseract将一个图片当成一个文档来看。如果只需要指定的区域可以使用不同的分割模式,使用psm参数
参考:https://blog.csdn.net/claroja/article/details/82992643
--oem 1 --oem 后面的参数 1代表用lstm引擎识别, 0表示用传统引擎识别
configfile 参数值为tessdata\configs 和 tessdata\tessconfigs 目录下的文件名.
通过这些操作可以将很大的提高识别的准确率,但是由于识别引擎自身限制,对中文识别并不友好,识别率依然没有达到我所需要的程度.
接下来要做的:
1.通过对已有的图片进行训练,但官方给的LSTM模式训练的操作还没有吃透,传统方式训练对识别率提高不大
2.尝试理解其内部的原理,并尝试加入自己理解(好像不大可能毕竟别人花了10年才写出来 笑哭)问题还有就是在于并没有多少资料,只有没有多少注释的源码,预计会花费很多的时间
五。python 调用方式
快速开始
-
try:
-
import Image
-
except ImportError:
-
from PIL import Image
-
import pytesseract
-
#如果PATH中没有tesseract可执行文件,请包含以下内容:
-
pytesseract.pytesseract.tesseract_cmd = r'<full_path_to_your_tesseract_executable>'
-
#示例tesseract_cmd = r'C:\ Program Files(x86)\ Tesseract-OCR \ tesseract'
-
#简单的图像串
-
print(pytesseract.image_to_string(Image.open('test.png')))
-
#法语文本图像串
-
print(pytesseract.image_to_string(Image.open('test-european.jpg'), lang='fra'))
-
#获取包围盒估计
-
print(pytesseract.image_to_boxes(Image.open('test.png')))
-
#获取详细的数据,包括盒,置信线和页码
-
print(pytesseract.image_to_data(Image.open('test.png')))
-
#获取有关方向和脚本检测信息
-
print(pytesseract.image_to_osd(Image.open('test.png'))
-
#为了绕过内部图像的转换,只需用相对或绝对图像路径
-
#注:如果你不使用支持的图像,正方体将返回错误
-
print(pytesseract.image_to_string('test.png'))
支持OpenCV image / NumPy数组对象
-
import cv2
-
img = cv2.imread(r'/<path_to_image>/digits.png')
-
print(pytesseract.image_to_string(img))
-
#或显式转换预先
-
print(pytesseract.image_to_string(Image.fromarray(img))
如果您有tessdata错误,请添加以下配置:“打开数据文件时出错......”
-
tessdata_dir_config = r ' - tessdata-dir“<replace_with_your_tessdata_dir_path>”'
-
#示例config:r' - tessdata-dir“C:\ Program Files(x86)\ Tesseract-OCR \ tessdata”'
-
#添加双引号很重要在dir路径附近。
-
pytesseract.image_to_string(image, lang='chi_sim', config=tessdata_dir_config)
功能
- get_tesseract_version返回系统中安装的Tesseract版本。
- image_to_string将图像上的Tesseract OCR运行结果返回到字符串
- image_to_boxes返回包含已识别字符及其框边界的结果
- image_to_data返回包含框边界,置信度和其他信息的结果。需要Tesseract 3.05+。有关更多信息,请查看Tesseract TSV文档
- image_to_osd返回包含有关方向和脚本检测的信息的结果。
参数
image_to_data(image,lang = None,config ='', nice = 0,output_type = Output.STRING)
- image Object,PIL Image /由Tesseract处理的图像的NumPy数组
- lang String,Tesseract语言代码字符串
- config String,任何其他配置为字符串,例如:config =' - psm 6'
- nice Integer,修改Tesseract运行的处理器优先级。Windows不支持。尼斯调整了类似unix的流程的优点。
- output_type Class属性,指定输出的类型,默认为string。有关所有支持类型的完整列表,请检查pytesseract.Output类的定义。
六。4.0 新功能引擎-Lstm深度学习的识别引擎
Tesseract4.0后支持双识别引擎:Lstm深度学习的识别引擎+传统引擎。这样能够使得未训练情况下也能得到较高的识别度
七。把网页上采集的图片不存到本地直接在内存中识别
使用image = BytesIO(response.content)转换为流数据
八。解决tesseract不识别最左侧字符的问题及指定白名单
参数中加上config="--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789"
九。-psm的说明
在网上找到了0-10项的中文说明(另外几项没找到...),如下:
0:定向脚本监测(OSD)
1: 使用OSD自动分页
2 :自动分页,但是不使用OSD或OCR(Optical Character Recognition,光学字符识别)
3 :全自动分页,但是没有使用OSD(默认)
4 :假设可变大小的一个文本列。
5 :假设垂直对齐文本的单个统一块。
6 :假设一个统一的文本块。
7 :将图像视为单个文本行。
8 :将图像视为单个词。
9 :将图像视为圆中的单个词。
10 :将图像视为单个字符。
十。训练注意事项
tesseract OCR训练新字体对图片的预处理和要求
同tesseract OCR识别对图片有要求一样,在训练新的字符集或新的字体时,对图片也有一定要求,符合要求的图片,能大大提高训练的效率。
在图像处理方面,去除噪声,使训练的字符图片尽量连贯、清晰。
其他方面,通常的要求如下:
1. 在一幅图片内,字体统一,决不能将多种字体混合出现在一幅训练图片内;如果不是通过扫描文本获取的字符图片,这个条件很容易被忽视。
2. 理想条件下,同种字体的字符图片集中到一幅大的训练图片中,在同一页内;
3. 要保留一定的字符间距与行间距;
4. 字符高度(大小),只要满足高度最小条件即可,对于小写字符x,其高度要至少大于10个像素;
5. 对于非字母字符,如!@#$%^&(),.{}<>/?,不要集中在一起出现,原因是这样不利于tesseract找出 文本行基线baseline,不利于文本高度及大小的检测,baseline检测是tesseract engine的第一步;
6. 一般每个字符需要10个样本,高频常见字符至少20个样本,不常见字符需要5个样本;
7. 对于同种字体,多页训练图片,可以在训练中,件用相同的方式合并tr文件和box文件,两类文件内的字符次序要相同,利于提高训练效果。
在获取训练字符图片方面,不一定非要从待识别图片中收集,可以利用word字符集找到对应字体,打印,扫描,获取训练图片,简单、方便。这个根据实际情况来应用。
十一 设置黑白名单
设置字符白名单(只有大小写字母):
# tesseract c.png out -psm 7 -c tessedit_char_whitelist='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
设置字符黑名单(不含数字):
# tesseract c.png out -psm 7 -c tessedit_char_blacklist='0123456789'