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实现DNS正向查询、反向查询的例子
Apr 25 Python
python中for语句简单遍历数据的方法
May 07 Python
Python中zfill()方法的使用教程
May 20 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
Golang与python线程详解及简单实例
Apr 27 Python
python实现周期方波信号频谱图
Jul 21 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
Python实现把类当做字典来访问
Dec 16 Python
Python3批量创建Crowd用户并分配组
May 20 Python
Python urlopen()参数代码示例解析
Dec 10 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
js/jQuery实现全选效果
2019/06/17 jQuery
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
基于python神经卷积网络的人脸识别
2018/05/24 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
python关闭占用端口方式
2019/12/17 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
思想专业自荐信范文
2013/12/25 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
《值日生》教学反思
2014/02/17 职场文书
经典商业广告词
2014/03/13 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
小学国庆节活动总结
2015/03/23 职场文书
2015年工商所工作总结
2015/05/21 职场文书
领导离职感言
2015/08/03 职场文书
导游词之安徽九华山
2019/09/18 职场文书