用 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)

最新文章

  1. Yii rbac原理和实践
  2. 2015年12月12 Node.js实战(一)使用Express+MongoDB搭建多人博客
  3. Unity3D项目开发一点经验
  4. POJ 3628 Bookshelf 2(01背包)
  5. Entity Framework 第六篇 分页查询
  6. Smart20学习记录----异步通知
  7. Loadrunner:场景中添加负载生成器
  8. 第十五章 调试及安全性(In .net4.5) 之 管理程序集
  9. 【原】Storm Local模式和生产环境中Topology运行配置
  10. Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake
  11. android102 查询,插入联系人
  12. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】
  13. Table显示滚动条
  14. hdoj 2057
  15. shiro过滤器详解分析
  16. C#基于LibUsbDotNet实现USB通信(一)
  17. Mvc 批量图片上传
  18. python项目实战三个小实例
  19. Django根据现有数据库建立/更新model
  20. SQLI DUMB SERIES-8

热门文章

  1. cmake 简易入门
  2. 对python里的装饰器
  3. js 动态添加元素 删除元素逻辑
  4. 基础nginx配置文件
  5. 提高js性能的方法
  6. 特斯拉私有化VS蔚来上市,电动汽车站在十字路口上
  7. Linux-IO多路复用select函数实践
  8. Springboot JpaRepository findOne() 方法报错
  9. 结点选择(树形DP)
  10. FJ的字符串-简单递归