用 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. c++ 模板联系4

    //定义类成员函数特化类型 #include "stdafx.h" #include <iostream> using namespace std; typedef f ...

  2. 循环(while,break,continue),转义字符

    01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺序执行代码 分支 -- 根据条件判断,决定执行代码的 分支 循环 -- 让 特定代码 重复 执行 02. while ...

  3. (转)jpbc的基本函数介绍

    双线性群简介 质数阶双线性群(Prime-Order Bilinear Groups) 质数双线性群可以由五元组(p,G1,G2,GT,e)来描述.五元组中p是一个与给定安全常数λ相关的大质数,G1, ...

  4. UVA 11584 入门DP

    一开始把它当成暴力来做了,即,从终点开始,枚举其最长的回文串,一旦是最长的,马上就ans++,再计算另外的部分...结果WA了 事实证明就是一个简单DP,算出两个两个点组成的线段是否为回文,再用LCS ...

  5. jq切换选择项

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. jstl中遍历Map

    在jstl中遍历Map和遍历List与数组一样,都是使用forEach标签. 例子: <%@ page import="java.util.Map" %> <%@ ...

  7. Ajax请求文件下载操作失败的原因和解决办法

    使用Poi做excel表格导出功能,第一个想到的就是用Ajax来发送请求,但是Ajax和后台代码都执行了,就是无法下载文件. 前台代码 function exportExl(){ var form = ...

  8. SpringContextHolder类

    1.通常使用SpringContextHolder类获取bean实例: 解决: 如果要在静态方法中调用某一bean的方法,那么该bean必须声明为static的,但正常情况下@Autowired无法注 ...

  9. [Java-基础] 什么是ORM

    ORM简介 ORM:对象关系映射:Object Relational Mapping 用于实现面向对象编程语言里不同类型系统的数据之间的转换 ​ 一般的,数据库绝大部分是面向关系的数据库,但是写代码的 ...

  10. 一键分享mob,方法二

    2.快速生成项目http://wiki.mob.com/android-sharesdk完整的集成文档/ 修改目标项目名称和项目的包名: 由于直接复制jar包和资源的集成方式比较麻烦,ShareSDK ...