Python识别验证码,基于Tesseract实现图片文字识别
一.简介
Tesseract是一个开源的文本识别【OCR】引擎,可通过Apache 2.0许可获得。它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言。该软件包包含一个ORC引擎【libtesseract】和一个命令行程序【tesseract】。Tesseract4添加了一个新的基于LSTM的OCR引擎,该引擎专注于行识别,但仍支持Tesseract 3的传统Tesseract OCR引擎,该引擎通过识别字符模式进行工作。通过使用传统OCR引擎模式【--oem 0】,可以与Tesseract 3兼容。它还需要训练好的数据文件对旧引擎进行支持,例如tessdata目录下的数据文件。
特点:
1.具有Unicode【UTF-8】支持,并且可以“开箱即用”地识别100多种语言。
2.支持各种输出格式,纯文本,hOCR【HTML】,PDF,仅不可见文本的PDF,TSV。Master分支还对ALTO【XML】输出提供实验性支持。
3.在许多情况下,要想获得更好的OCR结果,需要提高提供给Tesseract的图像的质量。
二.在python环境中安装pytesseract
安装成功!
三.在Windows系统下安装Tesseract
配置环境变量:
备注:最新的为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
部分示例:
可知对中文的识别一塌糊涂,因此建议还是使用版本4进行识别!
六.使用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<width;i++){ // 获取图片中所有像素点的rgb
25 for(int j=0;j<height;j++){
26 int pixel = image.getRGB(i, j); //获得坐标(i,j)的像素
27 int red = (pixel & 0xff0000) >> 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<width;i++){
41 int nums = 0;
42 for(int j=0;j<height;j++){
43 if(array[i][j][0]<128 && array[i][j][1]<128 && array[i][j][2]<128){
44 nums += 1;
45 }
46 }
47 if(nums > height * 0.8){
48 for(int n=0;n<height;n++){
49 array[i][n][0] = 255;
50 array[i][n][1] = 255;
51 array[i][n][2] = 255;
52 }
53 }
54 }
55 /**
56 * 清除表格线:
57 * 横线:绝大多数点的y值都为255
58 */
59 for(int j=0;j<height;j++){
60 int nums = 0;
61 for(int i=0;i<width;i++){
62 if(array[i][j][0]<128 && array[i][j][1]<128 && array[i][j][2]<128){
63 nums += 1;
64 }
65 }
66 if(nums > height * 0.8){
67 for(int n=0;n<width;n++){
68 array[n][j][0] = 255;
69 array[n][j][1] = 255;
70 array[n][j][2] = 255;
71 }
72 }
73 }
74 /**
75 * 大点
76 */
77 for(int i=0;i<width;i++){
78 for(int j=0;j<height;j++){
79 int cover = new Color(array[i][j][0],array[i][j][1],array[i][j][2]).getRGB();
80 image.setRGB(i,j,cover);
81 }
82 }
83 File file2 = new File(toPath);
84 ImageIO.write(image, "png", file2);
85 }
86
87 /**
88 * 测试
89 * @param args
90 */
91 public static void main(String[] args){
92 String fromPath = "E:\\testData\\tess\\111.png";
93 String toPath = "E:\\testData\\tess\\112.png";
94 try {
95 LineMark.clean(fromPath,toPath);
96 } catch (IOException e) {
97 e.printStackTrace();
98 }
99 }
100 }
七.执行结果
处理之前:
处理之后:
八.使用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<len;j++){
18 String[] array = this.a0.split("\n"); // 分行
19 for(int k=0;k<array.length;k++){
20 XSSFRow row = sheet.createRow(k); // 创建一行
21 String[] array2 = array[k].split(" ");
22 for(int m=0;m<array2.length;m++){
23 row.createCell(m).setCellValue(array2[m]);
24 }
25 }
26 }
27 }
28 public static void main(String[] args) throws IOException {
29 RP rp = new RP();
30 int num = 1;
31
32 File root = new File("E:\\testData\\tess2");//存放处理后的图片,imgs文件夹
33 File res = new File("E:\\testData\\tess");//源图片位置,res文件夹下
34
35 ITesseract instance = new Tesseract();
36 instance.setLanguage("chi_sim"); //使用训练好中文字库识别
37
38 XSSFWorkbook wb = new XSSFWorkbook();
39 XSSFSheet sheet = wb.createSheet("信息汇总");
40 try {
41 File[] ress = res.listFiles();
42 int i=0;
43 for(File file : ress){
44 i++;
45 LineMark.clean(file.getAbsolutePath(),"E:\\testData\\tess2\\"+i+".png");
46 } //去除源图片表格线,处理后的图片放到img文件夹
47
48 File[] files = root.listFiles();
49 for (File file : files) { //对去除水印后的图片逐个处理
50 BufferedImage sourceImg =ImageIO.read(new FileInputStream(file)); // 获取图片的长宽
51 int width = sourceImg.getWidth();
52 int height = sourceImg.getHeight();
53 Rectangle ret = new Rectangle(0,0,width,height); //识别全部数据
54
55 String result = instance.doOCR(file, ret); //开始采用doOCR(file)效率很低,因为图片内容太多
56 int len = 0;
57 if(result != null){
58 len = result.split(" ").length;
59 rp.a0 = result;
60 }
61 System.out.print(result);
62 rp.toExcel(num,wb,sheet,len); //调用toExcel函数,将提取到的信息写入
63 num++;
64 }
65 } catch (TesseractException e) {
66 System.err.println(e.getMessage());
67 }
68
69 try {
70 FileOutputStream fout = new FileOutputStream("D:\\software\\company.xlsx");
71 wb.write(fout);
72 fout.close();
73 } catch (IOException e) {
74 e.printStackTrace();
75 } //把写好信息的表输出
76 }
77
78 }
九.不数据清洗执行结果
十.数据清洗执行结果
经过对比可以明显看出,表格线对识别的影响很大【其它形式的干扰也同样如此,例如:验证码上的干扰线、图案等】,因此,数据清洗必不可少!
十一.分析
从上面的执行结果可知,在使用Tesseract 4时,在数据尽可能的清晰的情况下,大部分汉字还是能识别出来的,只是在【数字0】和【标点符号。】,【英语g】和【数字9】等外形相识的地方识别不清楚!当然,模型还有提升的空间,下一步将提升对存在格式倾斜或拍照的图片进行识别的能力!
Python识别验证码,基于Tesseract实现图片文字识别的更多相关文章
- 基于Tesseract实现图片文字识别
一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[l ...
- 基于Python37配置图片文字识别
以管理员权限打开cmd控制台. 1.如何安装PIL 输入下面命令:pip install Pillow 参考:https://www.cnblogs.com/mrgavin/p/8177841.htm ...
- Python人工智能之图片识别,Python3一行代码实现图片文字识别
1.Python人工智能之图片识别,Python3一行代码实现图片文字识别 2.tesseract-ocr安装包和中文语言包 注意:
- 基于Tesseract组件的OCR识别
基于Tesseract组件的OCR识别 背景以及介绍 欲研究C#端如何进行图像的基本OCR识别,找到一款开源的OCR识别组件.该组件当前已经已经升级到了4.0版本.和传统的版本(3.x)比,4.0时代 ...
- python3 图片文字识别
最近用到了图片文字识别这个功能,从网上搜查了一下,决定利用百度的文字识别接口.通过测试发现文字识别率还可以.下面就测试过程简要说明一下 1.注册用户 链接:https://login.bce.baid ...
- 【图片识别】java 图片文字识别 ocr (转)
http://www.cnblogs.com/inkflower/p/6642264.html 最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为 ...
- java 图片文字识别 ocr
最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...
- JAVA的图片文字识别技术
从2013年的记录看,JAVA中图片文字识别技术大部分采用ORC的tesseract的软件功能,后来渐渐开放了java-api调用接口. 图片文字识别技术,还是采用训练的方法.并未从根本上解决图片与文 ...
- 小试Office OneNote 2010的图片文字识别功能(OCR)
原文:小试Office OneNote 2010的图片文字识别功能(OCR) 自Office 2003以来,OneNote就成为了我电脑中必不可少的软件,它集各种创新功能于一身,可方便的记录下各种类型 ...
随机推荐
- js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式
创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...
- 题解【UVA12097】Pie
题目描述 输入格式 输出格式 输入输出样例 输入样例#1 3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2 输出样例#1 25.1327 3.1416 50.26 ...
- Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 数学 mod运算的性质
C. Ehab and a 2-operation task 数学 mod运算的性质 题意: 有两种对前缀的运算 1.对前缀每一个\(a +x\) 2.对前缀每一个\(a\mod(x)\) 其中x任选 ...
- 每天进步一点点------Allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别
Autosilk top:最后出gerber的时候,自动生成的丝印层.会自动调整丝印位置,以及碰到阻焊开窗的地方,丝印会自动消失,避免露锡的地方涂上丝印(一般画丝印层的时候,焊盘上不会画上丝印,所以过 ...
- HTTP头部字段总结【转】
原作者: 留七七, 地址:http://www.jianshu.com/p/6e86903d74f7 一.常用标准请求头字段 Accept 设置接受的内容类型 Accept-Charset 设 ...
- Qt5 error LNK2019 无法解析的外部符号的解决办法
今天在使用Qt Create 4.5.2时遇到一个莫名其妙的问题: 在原有工程里添加一个新类(有界面的),在调用的mainwindow.cpp中添加#include "a.h",然 ...
- Flask 教程 第十七章:Linux上的部署
本文翻译自The Flask Mega-Tutorial Part XVII: Deployment on Linux 这是Flask Mega-Tutorial系列的第十七部分,我将把Microbl ...
- 在VS2017中配置VLD(Visual Leak Detector)内存泄漏检测工具
首先在官方下载VLD 下载地址: https://kinddragon.github.io/vld/ 此版本为V2.5.1,为最后发布版本,下载后安装.加入你的安装路径为:VLD_Path,后面会用到 ...
- Git 常用命令总结,掌握这些,轻松驾驭版本管理
原创 最近公司的代码管理工具要从SVN转到Git上,因此虽然之前用过Git,但是都是一些简单的推送提交,因此还是有必要进行一些系统的学习,这里做一下笔记,以备后询,且不定期更新. 关于SVN和Git的 ...
- 虚拟机kali Linux 的网络配置
首先打开虚拟机中的kali 发现是没有办法连网的 然后我们将kaili关闭 然后打开 然后看黄色区域选择桥接模式然后重新启动即可 https://jingyan.baidu.com/article/7 ...