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

今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。
相应的,验证码识别大体可以分为下面几个步骤:
由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。
当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。
生成验证码这里我使用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来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# python验证码识别
# python验证码识别ocr
# Python实现一个简单的验证码程序
# python3 pillow生成简单验证码图片的示例
# Python简单的制作图片验证码实例
# 利用Python破解验证码实例详解
# python下调用pytesseract识别某网站验证码的实现方法
# python生成随机图形验证码详解
# 验证码
# 降噪
# 可以看出
# 噪点
# 这类
# 锐化
# 可以直接
# 最简单
# 为大
# 的是
# 而不是
# 写字母
# 我就
# 是个
# 来了
# 也有
# 在这个
# 还可以
# 不出
# 是这样
相关文章:
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何通过FTP服务器快速搭建网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何在七牛云存储上搭建网站并设置自定义域名?
临沂网站制作公司有哪些,临沂第四中学官网?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
建站之星免费版是否永久可用?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何快速搭建FTP站点实现文件共享?
全景视频制作网站有哪些,全景图怎么做成网页?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
PHP 500报错的快速解决方法
建站之星ASP如何实现CMS高效搭建与安全管理?
利用JavaScript实现拖拽改变元素大小
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
建站主机服务器选购指南:轻量应用与VPS配置解析
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
建站之星导航菜单设置与功能模块配置全攻略
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
b2c电商网站制作流程,b2c水平综合的电商平台?
如何在阿里云香港服务器快速搭建网站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何在阿里云ECS服务器部署织梦CMS网站?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
金*站制作公司有哪些,金华教育集团官网?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何在企业微信快速生成手机电脑官网?
如何在宝塔面板创建新站点?
如何快速搭建安全的FTP站点?
如何用景安虚拟主机手机版绑定域名建站?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
黑客入侵网站服务器的常见手法有哪些?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
临沂网站制作企业,临沂第三中学官方网站?
如何在景安服务器上快速搭建个人网站?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何通过cPanel快速搭建网站?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何在万网自助建站平台快速创建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。