吴裕雄--天生自然python学习笔记:python 用 Tesseract 识别验证码
用 Selenium 包实现网页自动化操作的案例中,发现很多网页都因
需输入图形验证码而导致实验无法进行 。 解决的办法就是对验证码进行识别 。 识
别的方法之 一 是通过图形处理包将验证码的大部分背景去除,再用 OCR COptical
Character Recognition ,光学字符识别)来识别出图片文字 。 不同的图形验证码需要
不同图形处理技术去除背景
简单的 OCR-丁esseract 包
Tesseract 是一个流行的 OCR 链接库,最初是由惠普公司(田)在 1985 年开始
研发,直到 2005 年 HP 将 Tesserac t 开源, 2006 年交给 Goog le 维护。
使用 Tesseract 识别图像
Tesseract 的使用方法非常简单,首先导入 Tesseract 包:

对图片进行识别的语法为:


用 Tesseract 识别文本|
识别 text I 扣g 图片后,将识别结果保存到 result. txt 文本文件中,再
读取文本文件的内容并显示到命令窗口 。
import subprocess
ocr = subprocess.Popen("tesseract F:\\pythonBase\\pythonex\\ch10\\media\\text1.jpg F:\\pythonBase\\pythonex\\ch10\\media\\result")
ocr.wait()
text = open("F:\\pythonBase\\pythonex\\ch10\\media\\result.txt").read().strip()
print(text)

验证码识别的原理
许多网站是用很小的彩色杂点背景加上字符的图片作为验证码,现在我们以某
银行网站的验证码为例,来学习这类验证码的破解:

首先用 OpenCV 的 cvtColor 方法将图形转为灰度模式。 cvtColor 方法的语法为:




import cv2, subprocess
img = cv2.imread("F:\\pythonBase\\pythonex\\ch10\\media\\bank.jpg") #讀圖
cv2.namedWindow("Image")
cv2.imshow("Image", img) #顯示圖形
cv2.waitKey (0)
cv2.destroyWindow("Image")

cv2.namedWindow("Image")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #轉為灰階
cv2.imshow("Image", gray) #顯示圖形
cv2.waitKey (0)
cv2.destroyWindow("Image")

cv2.namedWindow("Image")
_, inv = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV) #轉為反相黑白
cv2.imshow("Image", inv) #顯示圖形
cv2.waitKey (0)
cv2.destroyWindow("Image")

可以发现,黑白图形中有许多 白色杂点 。 我们可手动编写代码进行去除 :
for i in range(len(inv)): #i為每一列
for j in range(len(inv[i])): #j為每一行
if(inv[i][j] == 255): #顏色為白色
count = 0
for k in range(-2, 3):
for l in range(-2, 3):
try:
if inv[i + k][j + l] == 255: #若是白點就將count加1
count += 1
except IndexError:
pass
if count <= 6: #週圍少於等於6個白點
inv[i][j] = 0 #將白點去除
dilation = cv2.dilate(inv, (8,8), iterations=1) #圖形加粗 cv2.namedWindow("Image")
cv2.imshow("Image", dilation) #顯示圖形
cv2.waitKey (0)
cv2.destroyWindow("Image")

代码会逐行、逐列检查图片中每一个点 :以一个点为中 心 ,第 5
行和第 6 行代码用 range(-2 , 3 ) 逐一检查其上下左右各两排的点,共计 5 × 5=2 5 个点(包
含自身〉,如果是白色点就将计数器 count 加 l 。 第 12 行判断若这 2 5 个点中白点数
量小于或等于 6 个,就视此点为杂点 ,把这个点删除(设为黑点〉 。 例如下图检测点
周围只有 5 个 自点(含自身),执行的结果就会将其设置为黑点 。

图中的杂点大部分都己去除,但 Tesserac t OCR 识别此图片时仍无法得到正
确字符。所以,我们最后通过 Open CV 的 di l ate 方法把字体加粗, di l ate 方法会把图
片中的自点膨胀,语法为:


可以看到白色笔画己变粗了。再用 Tesseract OCR 识别此图片,就得到了正确验
证码。
验证码破解
程序概述
程序执行后会显示验证码图形,按任意键后会在命令窗口显示识别结果。

cv2.imwrite("F:\\pythonBase\\pythonex\\ch10\\media\\bank_t.jpg", dilation) #存檔
child = subprocess.Popen('tesseract F:\\pythonBase\\pythonex\\ch10\\media\\bank_t.jpg E:\\result') #OCR辨識
child.wait()
text = open('E:\\result.txt').read().strip()
print("驗證碼為 " + text)

吴裕雄--天生自然python学习笔记:python 用 Tesseract 识别验证码的更多相关文章
- 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告
实验课程名称:大数据处理技术 实验项目名称:hadoop集群实现PageRank算法 实验类型:综合性 实验日期:2018年 6 月4日-6月14日 学生姓名 吴裕雄 学号 15210120331 班 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL UPDATE 更新
如果需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 插入数据
MySQL 表中使用 INSERT INTO SQL语句来插入数据. 可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 以下为向MySQL数据表插入数据通 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL简介
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...
- 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子
1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...
- 吴裕雄--天生自然HADOOP学习笔记:基本环境配置
实验目的 学习安装Java 学习配置环境变量 学习设置免密码登陆的方法 掌握Linux环境下时间同步的配置 实验原理 1.Java的安装 java是大数据的黄金语言,这和java跨平台的特性是密不可分 ...
- 吴裕雄--天生自然HADOOP学习笔记:使用yum安装更新软件
实验目的 了解yum的原理及配置 学习软件的更新与安装 学习源代码编译安装 实验原理 1.编译安装 前面我们讲到了安装软件的方式,因为linux是开放源码的,我们可以直接获得源码,自己编译安装.例如: ...
- 吴裕雄--天生自然HADOOP学习笔记:Shell工具使用
实验目的 学习使用xshell工具连接Linux服务器 在连上的服务器中进入用户目录 熟悉简单的文件操作命令 实验原理 熟悉shell命令是熟悉使用linux环境进行开发的第一步,我们在linux的交 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 布局
网页布局对改善网站的外观非常重要. 请慎重设计您的网页布局. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 安装
所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...
随机推荐
- 阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析
[阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 ...
- Java查漏补缺(3)(面向对象相关)
Java查漏补缺(3) 继承·抽象类·接口·静态·权限 相关 this与super关键字 this的作用: 调用成员变量(可以用来区分局部变量和成员变量) 调用本类其他成员方法 调用构造方法(需要在方 ...
- POJ 1995:Raising Modulo Numbers 快速幂
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5532 Accepted: ...
- 洛谷 P1968 美元汇率
题目传送门 解题思路: 一道很简单的DP AC代码: #include<iostream> #include<cstdio> using namespace std; int ...
- Vue动态添加v-model绑定及获取其返回数据
从数据库拿到的动态数据绑定到页面对应的v-model或者v-bind上,并且根据对页的操作获取到返回的值: 1.首先在data里定义一个数据 timeTip 为一个空数组 data () { retu ...
- xlua 原理
基于版本 104 可以直接在lua访问c#函数原理: CS 是一个table,设置了一个__index函数,如果访问不存在的成员的时候,会走__index函数,调用import_type从C#中找到具 ...
- Python Learning Day3
爬虫练习 说是练习,实际是尝试了一些还没有具体了解的方式吧hhhhh' 基于urllib实现 import urllib.request import re url="https://www ...
- python课后练习当前目录下有一个文件名为score3.txt的文本文件, 存放着某班学生的学号和其两门专业课的成绩。
题目: 当前目录下有一个文件名为score3.txt的文本文件, 存放着某班学生的学号和其两门专业课的成绩.分 别用函数实现以下功能: (1) 定义函数function1,计算每个学生的平均分(取 整 ...
- MySQL优化查询相关
[查询优化相关] 1.如何定位相关慢的查询: a.可以开启慢查询日志,也可以使用show profiles 去记录相关查询到一个临时表再分析. b.show processlist 看看有没有大量等 ...
- ACwing算法基础课听课笔记(第一章,基础算法一)(二分)
二分法: 在看这个视频前,我对于二分法是一头雾水的,又加上这个算法平常从来没写过所以打了一年了还没正式搞过.视频提到ACwing上的一道题,我用自以为聪明的方法去做,结果TLE了,实在丢人,不说了,开 ...