python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别

前言

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:

  1. 图像类
  2. 滑动类
  3. 点击类
  4. 语音类

今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。

相应的,验证码识别大体可以分为下面几个步骤:

  1. 灰度处理
  2. 增加对比度(可选)
  3. 二值化
  4. 降噪
  5. 倾斜校正分割字符
  6. 建立训练库
  7. 识别

由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。

当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。

生成验证码这里我使用Claptcha (本地下载)这个库,当然Captcha(本地下载)这个库也是个不错的选择。

为了生成最简单的纯数字、无干扰的验证码,首先需要将claptcha.py的285行_drawLine做一些修改,我直接让这个函数返回None,然后开始生成验证码:

from claptcha import Claptcha

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c.write('1.png')

这里需要注意ubuntu的字体路径,也可以在网上下载其他字体使用。生成验证码如下:

可以看出,验证码有形变。对于这类最简单的验证码,可以直接使用谷歌开源的tesserocr来识别。

首先安装:

apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
pip install tesserocr

然后开始识别:

from PIL import Image
import tesserocr

p1 = Image.open('1.png')
tesserocr.image_to_text(p1)

'8069\n\n'

可以看出,对于这种简单的验证码,基本什么都不做识别率就已经很高了。有兴趣的小伙伴可以用更多的数据来测试,这里我就不展开了。

接下来,在验证码背景添加噪点来看看:

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)
t,_ = c.write('2.png')

生成验证码如下:

识别:

p2 = Image.open('2.png')
tesserocr.image_to_text(p2)
'8069\n\n'

效果还可以。接下来生成一个字母数字组合的:

c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c2.write('3.png')

生成验证码如下:

第3个为小写字母o,第4个为大写字母O,第5个为数字0,第6个为小写字母z,第7个为大写字母Z,最后一个是数字2。人眼已经跪了有木有!但现在一般验证码对大小写是不做严格区分的,看自动识别什么样吧:

p3 = Image.open('3.png')
tesserocr.image_to_text(p3)
'AMOOZW\n\n'

人眼都跪的计算机当然也废了。但是,对于一些干扰小、形变不严重的,使用tesserocr还是十分简单方便的。然后将修改的claptcha.py的285行_drawLine还原,看添加干扰线的情况。

p4 = Image.open('4.png')
tesserocr.image_to_text(p4)
''

加了条干扰线就完全识别不出来了,那么有没有什么办法去除干扰线呢?

虽然图片看上去是黑白的,但还需要进行灰度处理,否则使用load()函数得到的是某个像素点的RGB元组而不是单一值了。处理如下:

def binarizing(img,threshold):
 """传入image对象进行灰度、二值处理"""
 img = img.convert("L") # 转灰度
 pixdata = img.load()
 w, h = img.size
 # 遍历所有像素,大于阈值的为黑色
 for y in range(h):
  for x in range(w):
   if pixdata[x, y] < threshold:
    pixdata[x, y] = 0
   else:
    pixdata[x, y] = 255
 return img

处理后的图片如下:

可以看出处理后图片锐化了很多,接下来尝试去除干扰线,常见的4邻域、8邻域算法。所谓的X邻域算法,可以参考手机九宫格输入法,按键5为要判断的像素点,4邻域就是判断上下左右,8邻域就是判断周围8个像素点。如果这4或8个点中255的个数大于某个阈值则判断这个点为噪音,阈值可以根据实际情况修改。

def depoint(img):
 """传入二值化后的图片进行降噪"""
 pixdata = img.load()
 w,h = img.size
 for y in range(1,h-1):
  for x in range(1,w-1):
   count = 0
   if pixdata[x,y-1] > 245:#上
    count = count + 1
   if pixdata[x,y+1] > 245:#下
    count = count + 1
   if pixdata[x-1,y] > 245:#左
    count = count + 1
   if pixdata[x+1,y] > 245:#右
    count = count + 1
   if pixdata[x-1,y-1] > 245:#左上
    count = count + 1
   if pixdata[x-1,y+1] > 245:#左下
    count = count + 1
   if pixdata[x+1,y-1] > 245:#右上
    count = count + 1
   if pixdata[x+1,y+1] > 245:#右下
    count = count + 1
   if count > 4:
    pixdata[x,y] = 255
 return img

处理后的图片如下:

好像……根本没卵用啊?!确实是这样的,因为示例中的图片干扰线的宽度和数字是一样的。对于干扰线和数据像素不同的,比如Captcha生成的验证码:

从左到右依次是原图、二值化、去除干扰线的情况,总体降噪的效果还是比较明显的。另外降噪可以多次执行,比如我对上面的降噪后结果再进行依次降噪,可以得到下面的效果:

再进行识别得到了结果:

p7 = Image.open('7.png')
tesserocr.image_to_text(p7)
'8069 ,,\n\n'

另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。
第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • python3结合openpyxl库实现excel操作的实例代码

    一.相关说明: 1.openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件:2007一下的版本为xls结尾的文件,需要使用 xlrd和xlwt库进行操作 2.excel表的文字编码如果是"gb2312" 读取后就会显示乱码,请先转成Unicode 3.workbook: 工作簿,一个excel文件包含多个sheet. 4.sheet:工作表,一个workbook有多个,表名识别,如"sheet1","sheet2&qu

  • Python运维开发之psutil库的使用详解

    介绍 psutil能够轻松实现获取系统运行的进程和系统利用率. 导入模块 import psutils 获取系统性能信息 CPU信息 使用cpu_times()方法获取CPU的完整信息: >>> psutil.cpu_times() 获取单项数据,例如用户user的CPU时间比: >>> psutil.cpu_times().user 获取CPU的个数: >>> psutil.cpu_count() # 默认logical=True,获取逻辑个数 &g

  • Tesserocr库的正确安装方式

    win10,直接使用 pip install tesserocr 的命令 如果输出如下错误提示: tesserocr.cpp(596): fatal error C1083: 无法打开包括文件: " leptonica/allheaders.h ": No such file or directory error: command 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe'

  • Python爬虫常用库的安装及其环境配置

    Python常用库的安装 urllib.re 这两个库是Python的内置库,直接使用方法import导入即可. 在python中输入如下代码: import urllib import urllib.request response=urllib.request.urlopen("http://www.baidu.com") print(response) 返回结果为HTTPResponse的对象: <http.client.HTTPResponse object at 0x0

  • Python爬虫基础之XPath语法与lxml库的用法详解

    前言 本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 XPath 即为 XML 路径语言,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言. XPath 基于 XML 的树状结构,提供在数据结构树中找寻节点的能力. XPath 同样也支持HTML. XPath 是一门小型的查询语言. python 中 lxml库 使用的是 Xpath 语法,是

  • Python中Proxypool库的安装与配置

    从github上下载,链接为:https://github.com/jhao104/proxy_pool 下载好之后解压文件,然后将文件夹目录内的D:\proxy_pool-master 这个文件修改成这个样式: 然后在命令行移动到 输入pip install -r requirements.txt下载命令即可. 打开D:\proxy_pool-master\ProxyGetter路径内的 这个文件内的部分代码注释掉. 接下来进行测试即可 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家

  • Python wxPython库Core组件BoxSizer用法示例

    本文实例讲述了Python wxPython库Core组件BoxSizer用法.分享给大家供大家参考,具体如下: wx.BoxSizer: box = wx.BoxSizer(integer orient) The orientation can be wx.VERTICAL or wx.HORIZONTAL box.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0) 参数解读: 1.

  • Python3.6简单的操作Mysql数据库的三个实例

    安装pymysql 参考:https://github.com/PyMySQL/PyMySQL/ pip install pymsql 实例一 import pymysql # 创建连接 # 参数依次对应服务器地址,用户名,密码,数据库 conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123456', db='demo') # 创建游标 cursor = conn.cursor(cursor=pymysql.cursor

  • 对python3中pathlib库的Path类的使用详解

    用了很久的os.path,今天发现竟然还有这么好用的库,记录下来以便使用. 1.调用库 from pathlib import 2.创建Path对象 p = Path('D:/python/1.py') print(p) #可以这么使用,相当于os.path.join() p1 = Path('D:/python') p2 = p1/'123' print(p2) 结果 D:\python\1.py D:\python\123 3.Path.cwd() 获取当前路径 path = Path.cw

  • 3个用于数据科学的顶级Python库

    Python有许多吸引力,如效率,代码可读性和速度,使其成为数据科学爱好者的首选编程语言.Python通常是希望升级其应用程序功能的数据科学家和机器学习专家的首选. 由于其广泛的用途,Python拥有大量的库,使数据科学家可以更轻松地完成复杂的任务,而无需很多编写代码的麻烦.以下是数据科学的前3个Python库. 使用这些库将Python转化为一个科学的数据分析和建模工具. 1.NumPy NumPy(Numerical Python的缩写)是配备有用资源的顶级库之一,可帮助数据科学家将Pyth

  • 用于业余项目的8个优秀Python库

    在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留.对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直停留在 Python 的世界里,不愿离开,那就是我们可以很容易地利用一顿午餐或晚上几个小时的时间,把一个想法快速地实现出来. 作为一门语言,你知道 Python 是如何获得现在的成功的吗? 不妨去看看它大量的库吧,不管是原生的,还是第三方的,可能会有所收获. 有这么多的库,也就不奇怪为什么有的很多人用,有的却没有引起多少人注意. 而且,专注于一个领域的程序员

  • Python连接Mssql基础教程之Python库pymssql

    前言 pymssql模块是用于sql server数据库(一种数据库通用接口标准)的连接.另外pyodbc不仅限于SQL server,还包括Oracle,MySQL,Access,Excel等. 另外除了pymssql,pyodbc还有其他几种连接SQL server的模块,感兴趣的可以在这里找到:https://wiki.python.org/moin/SQL%20Server 本文将详细介绍关于Python连接Mssql之Python库pymssql的相关内容,下面话不多说了,来一起看看详

  • 让代码变得更易维护的7个Python库

    随着软件项目进入"维护模式",对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准).然而,在代码库中保持一致的代码风格和测试标准能够显著减轻维护的压力,也能确保新的开发者能够快速了解项目的情况,同时能更好地全程保持应用程序的质量. 使用外部库来检查代码的质量不失为保护项目未来可维护性的一个好方法.以下会推荐一些我们最喜爱的 检查代码 (包括检查 PEP 8 和其它代码风格错误)的库,用它们来强制保持代码风格一致,并确保在项目成熟时有一个可接受的测试覆盖率. 检查你的代

  • Python的argparse库使用详解

    argparse是python标准库里面用来处理命令行参数的库 命令行参数分为位置参数和选项参数: 位置参数就是程序根据该参数出现的位置来确定的 如:[root@openstack_1 /]# ls root/    #其中root/是位置参数 选项参数是应用程序已经提前定义好的参数,不是随意指定的 如:[root@openstack_1 /]# ls -l    # -l 就是ls命令里的一个选项参数. 基本使用 import argparse # 创建解析器 parser = argpars

随机推荐