Python3使用tesserocr识别字母数字验证码的实现


Posted in Python onJanuary 29, 2021

一、背景

最近有个需求是从一个后台的留言网站爬取留言数据,后台管理网站必然涉及到了登录,登录就有个验证码的问题必须得解决,由于验证码是从后端生成的,并且不了解其生成规则,那就只能通过图像识别技术来做验证码识别了!通过查阅资料发现Python中的的tesserocr这个库好像使用的比较多,所以对这个库进行了一番研究,并且实现了那个后台网站验证码的识别。

二、准备工作

1. 安装tesserocr

由于我使用的Python版本是python3.5,所以一下所有操作都是基于python3的,如果有python2的同学,可以找找其他教程~~

首先需要下载tesseract,它为tesserocr提供底层支持。具体下载官方路径:https://github.com/UB-Mannheim/tesseract/wiki,选择对应的系统版本,可以选择一个相对不带dev的稳定版本下载,如:tesseract-ocr-setup-3.05.02-20180621.exe。然后一路安装,唯一记得勾选Additional language data(download),勾选可能会用到的语言tessdata,如简体、繁体中文,数学模块等,不需要全选,下载tessdata的时间会比较长。

然后安装python3对应的tesserocr库,通常我们安装库的方法是使用命令pip install tesserocr,但是这里会报错:“error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools",这个时候不宜直接去下载Microsoft Visual C++ Build Tools,而是使用原始的whl文件方式安装。tesserocr 的whl官方文件下载路径:https://github.com/simonflueckiger/tesserocr-windows_build/releases,下载本地环境对应的whl文件,如我的是window64位系统,python版本是3.5。下载完后,使用cd跳转到whl文件所在目录,然后 执行 ”pip installtesserocr-2.2.2-cp35-cp35m-win_amd64.whl“,即可轻松完成安装。

Python3使用tesserocr识别字母数字验证码的实现

紧接着用例子验证如何使用:我们找到一个验证码图片:image.jpg,下载到本地磁盘,用代码进行验证:

import tesserocr
from PIL import Image
image=Image.open('image.jpg')
print(tesserocr.image_to_text(image))

不出意外,首次运行总是不顺利,相信我遇到的坑大多数人都会遇到,大抵错误类似:

Traceback (most recent call last):
File "G:\pythonSources\my12306/obtain_message\test.py", line 4, in <module>
print(tesserocr.image_to_text(image))
File "tesserocr.pyx", line 2400, in tesserocr._tesserocr.image_to_text
RuntimeError: Failed to init API, possibly an invalid tessdata path: “本地某个路径”

有个比较简单粗暴的解决方法是把安装好的Tesseract-OCR下的tessdata文件夹整个拷贝到提示的那个路径中,亲测有效。

2. 安装opencv

由于验证码需要做一些优化处理,方便更加容易被tesserocr识别,所以需要使用opencv来做一些特殊的处理,安装opencv比较简单,直接pip install opencv-python即可。

三、识别过程

1. 将图片变成黑白图片

我需要爬取数据的这个后台网站验证码是黄底白字的,这种色差较小的tesserocr识别起来比较困难,稍微试了一下,基本上没怎么识别对过。。。所以我们需要先将图片变成色差最大的黑白图片。初始图片见下图:

Python3使用tesserocr识别字母数字验证码的实现

首先,将图片变成灰色,并将灰色图片保存起来方便后续做对比,变成灰色以后的图片如下:

Python3使用tesserocr识别字母数字验证码的实现

变成灰色后,通过像素点的颜色值将灰色部分的背景变成白色,白色的具体内容变成黑色,这样白底黑字的黑白图片就有了:

Python3使用tesserocr识别字母数字验证码的实现

处理成黑白图片的实现代码如下:

img = Image.open(self.code_path)
# 将图片变成灰色
img_gray = img.convert('L')
img_gray.save('../images/code_gray.png')
# 转成黑白图片
img_black_white = img_gray.point(lambda x: 0 if x > 200 else 255)
img_black_white.save('../images/code_black_white.png')

2. 去除图片噪点

图片转成黑白以后,一些杂点也随着我们的主体内容变成了黑色的点,这样对识别的效果也有较大的影响,所以需要想办法将这些干扰点去掉。这里就需要借助opencv的功能了,在使用opencv去除噪点之前,需要先将图片做灰值化以及二值化处理,具体代码如下所示:

# opencv处理
img_cv = cv2.imread('../images/code_black_white.png')
# 灰值化
im = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
# 二值化
cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)

基本处理之后,就需要消除噪点了,消除噪点的原理也比较简单,就是遍历图片的每一个像素点,找到其上下左右四个像素点位置的颜色,如果这四个点中白色点的数量大于2则说明这个点是噪点,需要将该点的颜色直接置为白色点,在边框位置的像素点也直接置为白色,因为主要内容一般都是在图片中间的。以下为处理噪点的代码:

# 噪点处理
def interference_point(img):
  filename = '../images/code_result.png'
  h, w = img.shape[:2]
  # 遍历像素点进行处理
  for y in range(0, w):
    for x in range(0, h):
      # 去掉边框上的点
      if y == 0 or y == w - 1 or x == 0 or x == h - 1:
        img[x, y] = 255
        continue
      count = 0
      if img[x, y - 1] == 255:
        count += 1
      if img[x, y + 1] == 255:
        count += 1
      if img[x - 1, y] == 255:
        count += 1
      if img[x + 1, y] == 255:
        count += 1
      if count > 2:
        img[x, y] = 255
  cv2.imwrite(filename, img)
  return img, filename

噪点处理完毕之后,就是一张非常清晰的图片了:

Python3使用tesserocr识别字母数字验证码的实现

这个时候就可以直接使用tesserocr来识别了,具体识别的方式如下:

tesserocr.image_to_text(img_result)

识别测试结果如下:

Python3使用tesserocr识别字母数字验证码的实现

经过多次识别验证测试,另外也由于这个验证码的字体相对比较规范,所以成功率是相当的高了,即使偶尔的一次失败,我们也是可以进行重试就又成功了。哈哈, 差不多就是这个样子啦,欢迎大家指正文中的问题~~不多说了,我要去使用新学的技术去做“坏事”了!

到此这篇关于Python3使用tesserocr识别字母数字验证码的实现的文章就介绍到这了,更多相关Python3 tesserocr识别字母数字验证码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python 中字典嵌套列表的方法
Jul 03 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
Python中那些 Pythonic的写法详解
Jul 02 Python
Django基础知识 web框架的本质详解
Jul 18 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
Python爬取梨视频的示例
Jan 29 #Python
使用Python封装excel操作指南
Jan 29 #Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 #Python
python使用numpy中的size()函数实例用法详解
Jan 29 #Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 #Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 #Python
Python3中对json格式数据的分析处理
Jan 28 #Python
You might like
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
PHP中比较时间大小实例
2014/08/21 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
js实现文字截断功能
2016/09/14 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
Vue的props父传子的示例代码
2020/05/20 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
Python 生成VOC格式的标签实例
2020/03/10 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
校园之声广播稿
2014/01/31 职场文书
读书演讲主持词
2014/03/18 职场文书
工程质量承诺书范文
2014/03/27 职场文书
奠基仪式策划方案
2014/05/15 职场文书
要账委托书范本
2014/09/15 职场文书
个园导游词
2015/02/04 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL