Python识别验证码,基于Tesseract实现图片文字识别

一.简介

Tesseract是一个开源的文本识别【OCR】引擎,可通过Apache 2.0许可获得。它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言。该软件包包含一个ORC引擎【libtesseract】和一个命令行程序【tesseract】。Tesseract4添加了一个新的基于LSTM的OCR引擎,该引擎专注于行识别,但仍支持Tesseract 3的传统Tesseract OCR引擎,该引擎通过识别字符模式进行工作。通过使用传统OCR引擎模式【--oem 0】,可以与Tesseract 3兼容。它还需要训练好的数据文件对旧引擎进行支持,例如tessdata目录下的数据文件。

Python识别验证码,基于Tesseract实现图片文字识别_第1张图片

特点:

1.具有Unicode【UTF-8】支持,并且可以“开箱即用”地识别100多种语言。

2.支持各种输出格式,纯文本,hOCR【HTML】,PDF,仅不可见文本的PDF,TSV。Master分支还对ALTO【XML】输出提供实验性支持。

3.在许多情况下,要想获得更好的OCR结果,需要提高提供给Tesseract的图像的质量。

二.在python环境中安装pytesseract

Python识别验证码,基于Tesseract实现图片文字识别_第2张图片

安装成功!

三.在Windows系统下安装Tesseract

Python识别验证码,基于Tesseract实现图片文字识别_第3张图片

配置环境变量:

备注:最新的为4.1.0,建议安装4.x版本,根据一可知,版本4有重大升级,系统性能显著提升,特别是在对中文的识别上更是明显!

四.python代码实现

 1 # -*- coding: utf-8 -*-
 2 """
 3 Spyder Editor
 4 
 5 This is a temporary script file.
 6 """
 7 
 8 import  pytesseract
 9 from PIL import Image
10 
11 #打开验证码图片
12 image = Image.open('E:\\testData\\tess\\1.png')
13 #加载一下图片防止报错,此处可以省略
14 #image.load()
15 #调用show来展示图片,调试用此处可以省略
16 #image.show()
17 text = pytesseract.image_to_string(image,lang='chi_sim')
18 print(text)

五.Python环境执行结果【无数据清洗】

20
a
志
口
吴
吊
5
达
吊
园

康 阮 随 阮 随 随 阮 隆 随 阮 阮 庞
应 阮 院 阮 阮 际 阮 阮 院 院 阮 庞

宇
B
B
B
B
B
B
B
B
B
B
E

 

胡
胡
胡
胡
胡
胡
胡
胡
胡
胡
脱 医

剧 澈 剖 剖 亨 亨 定 亨 宣 河

  

宇
B
B
B
B
E
E
E
E
E
E
振

产 莲

主
主
主
主
主
主
主
主
主
主
生 交

E
E
E
E
E
E
E
E
E
E
E35653

职
职
职
职
职
职
职
职
职
职
E

E
E
E
E
E
E
E
E
E
E
093

View Code

部分示例:

Python识别验证码,基于Tesseract实现图片文字识别_第4张图片

可知对中文的识别一塌糊涂,因此建议还是使用版本4进行识别!

Python识别验证码,基于Tesseract实现图片文字识别_第5张图片

六.使用Java程序调用ImageIO进行数据预处理

  1 package zhen;
  2 import java.awt.Color;
  3 import java.awt.image.BufferedImage;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.IOException;
  7 
  8 import javax.imageio.ImageIO;
  9  
 10  
 11 public class LineMark{
 12     public static void clean(String fromPath,String toPath) throws IOException{
 13         File file1 = new File(fromPath);
 14         BufferedImage image = ImageIO.read(file1);
 15         
 16         BufferedImage sourceImg =ImageIO.read(new FileInputStream(file1));  // 获取图片的长宽
 17         int width = sourceImg.getWidth();
 18         int height = sourceImg.getHeight();
 19         
 20         /**
 21          * 创建3维数组用于保存图片rgb数据
 22          */
 23         int[][][] array = new int[width][height][3];
 24         for(int i=0;i> 16; 
 28                 int green = (pixel & 0xff00) >> 8;
 29                 int blue = (pixel & 0xff);  //通过坐标(i,j)的像素值获得r,g,b的值   
 30                 array[i][j][0] = red;
 31                 array[i][j][1] = green;
 32                 array[i][j][2] = blue;
 33             }
 34         }
 35         
 36         /**
 37          * 清除表格线:
 38          * 竖线:绝大多数点的x值都为255
 39          */
 40         for(int i=0;i height * 0.8){
 48                 for(int n=0;n height * 0.8){
 67                 for(int n=0;n 
 

七.执行结果

处理之前:

Python识别验证码,基于Tesseract实现图片文字识别_第6张图片

处理之后:

Python识别验证码,基于Tesseract实现图片文字识别_第7张图片

Python识别验证码,基于Tesseract实现图片文字识别_第8张图片

八.使用Tesseract 4 API进行文字识别

 1 package zhen;
 2 import java.awt.Rectangle;
 3 import java.awt.image.BufferedImage;
 4 import java.io.File;
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import javax.imageio.ImageIO;
 9 import net.sourceforge.tess4j.*;
10 import org.apache.poi.xssf.usermodel.*;
11  
12 public class RP {
13     private String a0="";
14 
15         public void toExcel(int i,XSSFWorkbook wb,XSSFSheet sheet,int len)  //将文字信息做成表格
16         {            
17             for(int j=0;j 
 

九.不数据清洗执行结果

Python识别验证码,基于Tesseract实现图片文字识别_第9张图片

十.数据清洗执行结果

Python识别验证码,基于Tesseract实现图片文字识别_第10张图片

经过对比可以明显看出,表格线对识别的影响很大【其它形式的干扰也同样如此,例如:验证码上的干扰线、图案等】,因此,数据清洗必不可少!

Python识别验证码,基于Tesseract实现图片文字识别_第11张图片

十一.分析

从上面的执行结果可知,在使用Tesseract 4时,在数据尽可能的清晰的情况下,大部分汉字还是能识别出来的,只是在【数字0】和【标点符号。】,【英语g】和【数字9】等外形相识的地方识别不清楚!当然,模型还有提升的空间,下一步将提升对存在格式倾斜或拍照的图片进行识别的能力!

你可能感兴趣的:(Python识别验证码,基于Tesseract实现图片文字识别)