用 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 识别验证码的更多相关文章

  1. 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告

    实验课程名称:大数据处理技术 实验项目名称:hadoop集群实现PageRank算法 实验类型:综合性 实验日期:2018年 6 月4日-6月14日 学生姓名 吴裕雄 学号 15210120331 班 ...

  2. 吴裕雄--天生自然MySQL学习笔记:MySQL UPDATE 更新

    如果需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table ...

  3. 吴裕雄--天生自然MySQL学习笔记:MySQL 插入数据

    MySQL 表中使用 INSERT INTO SQL语句来插入数据. 可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 以下为向MySQL数据表插入数据通 ...

  4. 吴裕雄--天生自然MySQL学习笔记:MySQL简介

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

  5. 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子

    1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...

  6. 吴裕雄--天生自然HADOOP学习笔记:基本环境配置

    实验目的 学习安装Java 学习配置环境变量 学习设置免密码登陆的方法 掌握Linux环境下时间同步的配置 实验原理 1.Java的安装 java是大数据的黄金语言,这和java跨平台的特性是密不可分 ...

  7. 吴裕雄--天生自然HADOOP学习笔记:使用yum安装更新软件

    实验目的 了解yum的原理及配置 学习软件的更新与安装 学习源代码编译安装 实验原理 1.编译安装 前面我们讲到了安装软件的方式,因为linux是开放源码的,我们可以直接获得源码,自己编译安装.例如: ...

  8. 吴裕雄--天生自然HADOOP学习笔记:Shell工具使用

    实验目的 学习使用xshell工具连接Linux服务器 在连上的服务器中进入用户目录 熟悉简单的文件操作命令 实验原理 熟悉shell命令是熟悉使用linux环境进行开发的第一步,我们在linux的交 ...

  9. 吴裕雄--天生自然HTML学习笔记:HTML 布局

    网页布局对改善网站的外观非常重要. 请慎重设计您的网页布局. <!DOCTYPE html> <html> <head>  <meta charset=&qu ...

  10. 吴裕雄--天生自然MySQL学习笔记:MySQL 安装

    所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...

随机推荐

  1. jquery ajax常用的登录登出

    整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...

  2. Ubuntu13.04闪屏的问题

    我的电脑Y460,双显切换,win7+ubuntu双系统,就是这个坑爹的双显切换,导致安装ubuntu13.04后屏老闪,网上查阅资料得知是显卡问题,一种是说显卡驱动问题,一种是说双显卡问题,双显卡问 ...

  3. Windbg 实践之符号篇

    How to display the size value 1)一开始不会加载,chksym 了一下就加载了. 2) 新版本已经可以显示size的大小了 3)?? 显示变量的类型 4)x std::v ...

  4. 理解String的intern()方法

    API文档中的介绍: intern public String intern() Returns a canonical representation for the string object. A ...

  5. 1.GIT的安装使用

    官方安装文档:https://www.git-scm.com/book/en/v2/Getting-Started-Installing-Git 以下一mac安装做笔记 点击链接 http://git ...

  6. PAT Advanced 1090 Highest Price in Supply Chain (25) [树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)–everyone inv ...

  7. PCB上LED指示灯电流、电压总结

    一般指示灯正常发光的电流在10~20mA,低电流LED灯的工作电流在2mA一下,亮度和普通的一样. 压降                    电流 红色         1.82~1.88V     ...

  8. OpenMP笔记(五)

    任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会造成各个线程计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核 ...

  9. Python笔记_第四篇_高阶编程_高阶函数_3.sorted

    1. sorted函数: 常用的排序分:冒泡排序.选择排序.快速排序.插入排序.计数器排序 实例1:普通排序 # 普通排序 list1 = [,,,,] list2 = sorted(list1) # ...

  10. bugs开发异常解决方法

    1.      前提 第一层:遇到异常首先必须告诉自己,冷静,不要慌.(一看到Bug就心慌,那么就不能释放必杀技) 2.      入门级 第二层:遇到Bug,第一潜意识看输出异常的信息的(控制台输出 ...