Mac使用pytesseract识别百度指数图片,并训练提高其准确率

参考文章1

1、安装tesseract ocr引擎和jTessBoxEditor

a、使用HomeBrew进行安装

#1.这是个安装HomeBrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
#2安装tesseract
brew install tesseract

由于我们需要进行训练提高识别的准确率,所有使用下面的安装命令,主要如果先前已经安装了先执行brew uninstall tesseract,然后执行下面命令

brew install --with-training-tools tesseract

b、安装jTessBoxEditor的安装
下载地址,由于该工具依赖于java环境,所以需要安装java环境。使用brew cask安装java8环境

brew tap caskroom/versions
brew cask install java8

2、开始训练

a、首先将.png格式的图片转换为.tif格式,
b、将.tif格式的文件进行合并,打开jTessBoxEditor.jar,然后点菜单上的Tool->Merge TIFF ,主要命名使用官方推荐。官网的写法是这样的

[lang].[fontname].exp[num].tif 
[lang]是语言,随便起,这里的叫sll 
[fontname]是字体,随便起,这里叫 normal 
[num]我也不知道啥意思,写的是数字0 
这两个都是自定义的,后面会用到,所以要记住。

我这里取名为eng.num.exp0.tif

0C7CA992-DF20-4FCB-908D-2C6B180C2C64.png

c、生成.box文件,用来纠正字体识别的错误
使用如下命令,就会在同一目录下面生成一个.box文件夹

tesseract eng.num.exp0.tif eng.num.exp0 -l eng batch.nochop makebox

d、使用jTessBoxEditor打开进行,对识别结果进行修改,然后保存,如下图

E7D66AD2-DC02-45C6-87D0-6215FD82E348.png

e、编写.sh脚本进行训练,脚本如下:

#!/bin/sh
read -p "输入你语言:" lang
echo ${lang}
read -p "输入你的字体:" font
echo ${font}
echo "所以完整文件名为:"
echo ${lang}.${font}.exp0.tif
echo "开始。。。"
echo ${font} 0 0 0 0 0 >font_properties
tesseract  ${lang}.${font}.exp0.tif ${lang}.${font}.exp0  nobatch box.train
unicharset_extractor ${lang}.${font}.exp0.box
shapeclustering -F font_properties -U unicharset ${lang}.${font}.exp0.tr
mftraining -F font_properties -U unicharset -O unicharset ${lang}.${font}.exp0.tr
cntraining ${lang}.${font}.exp0.tr
echo "开始重命名文件"
mv inttemp ${font}.inttemp
mv normproto ${font}.normproto
mv pffmtable ${font}.pffmtable
mv shapetable ${font}.shapetable
mv unicharset ${font}.unicharset
echo "生成最终文件"
combine_tessdata ${font}.
echo "完成"

执行脚本后,生成文件如下

394C6559-F176-4344-A1BB-0529A1701897.png

最后将num.traineddata复制到到/usr/local/Cellar/tesseract/3.05.00/share/tessdata目录当中,就可以使用了。使用tesseract --list-langs来查看支持的类型,使用如下

from PIL import Image
import pytesseract
import os
import re
import fnmatch



def recognize_Image(fileName=None):
    img = Image.open(fileName)
    # img = img.convert('L') 二值化
    code = pytesseract.image_to_string(img,lang='num')

    code = ''.join(re.findall('\d+',code))
    print(code)
    return code

推荐阅读更多精彩内容