【成长笔记】图片验证码识别

本文记录了一位作者实现图片验证码识别的过程,从预处理、字符分割、手动分类到使用支持向量机(SVM)进行训练。通过Python的opencv和sklearn库,作者成功地创建了一个识别验证码的模型,并分享了遇到的挑战与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记得很早以前,我对如携程飞猪等第三方平台购买火车票不用输入验证码感到很……牛!百度后发现其可能是实现了自动打码,或者说机器自动识别验证码,我很好奇。

后来,当我觉得我必须要给自己找些有趣的知识来学习的时候,脑海里萌生了去实现一个简单的验证码识别程序的想法。在一切未知以前,我觉得很难,甚至望而却步。但,真正一点点地行动下来,我发现,其实慢慢深入后,无论多么困难的问题,都能一点点解决。

不要着急,不要慌张,一点点地啃下来,一个方式不通,换个思路解决,不要轻易放弃。这个过程中,世上无难事,只怕有心人,古人诚不欺我。任何事情,流于表面而不做,是永远不会成长的——谨以告诫自己。 

好了,废话不多说。

-----------------------------------------------------我是萌萌的分割线--------------------------------------------------------准备:

  • 语言:python
  • python库:opencv,sklearn,requests等

流程:整体大致流程为四部分,预处理,字符分割,字符标记分类,字符识别

  • 预处理:对原始验证码图片进行如灰度处理,二值化,降噪等处理,为下一步的字符分割提供一个好的素材
  • 字符分割:将预处理后的图片中的每个字符单独分割出来,本次分割的图片比较取巧,当预处理后,图片中各个字符的位置是相对固定的,所以,采用的分割方法为等距分割。
  • 字符标记分类:当字符分割好后,需要人为为字符进行分类标记,这个过程属于体力活,比较繁琐。我尝试过直接调用谷歌的ocr(光学字符识别)工具库pytesseract来代替人工识别,但是结果非常不好,无奈,还是只能先人工仔细分类。
  • 字符识别:分类好后,图片经过二值化转换为01的数据,写入一个txt格式文件中,作为训练集,其结果类似如下所示:
图片转换为可训练的数字文本数据

再利用机器学习算法对之进行训练,本文使用的是经典的svm(支持向量机)算法对图片验证码进行训练。支持向量机的原理以及优势百度谷歌均可详细查到。

实现:

  • 获取图片验证码

巧妇难为无米之炊,首先,我们要有原材料。在网上,我们可以很轻易地找到图片验证码。本文找的是csdn上的图片验证码。当然了,我们需要的验证码素材至少也要百张以上吧。如果傻乎乎地鼠标刷新保存图片,那效率太低了。要充分利用好可以利用的工具,python中的url库,requests库等都是很强大的工具库。用来爬取网络资源数据可以说是无往不利,哈哈,莫笑我略装*哈~

# coding=utf8
import requests

res = requests.get('img_code_url') # 这是一个get请求,获取图片资源
with open(file_path + "/%d.jpg" % num, "wb") as f: # 将图片保存在本地
    f.write(res.content)
    print("%d" % num + "获取成功")

如何获取图片验证码呢,我们可以利用浏览器的开发者模式(一般F12快捷键即可打开)或者利用专业的抓包软件如Charles(收费)等来查看获取。以上是个简单地将网上的图片验证码保存到本地的程序代码。

如果我们选择的图片验证码本身是十分清晰的没有太多混淆的状态,我们可以考虑用pytesseract直接对它进行识别。比如此类图片:

可以看出,以上这张图片验证码并未经过太多复杂处理,文本清晰,所以可以很容易ocr直接识别。但是如此类验证码则不然:

可以看出,这类验证码被经过了很多噪声处理,很多像素点在混淆,如果不经过处理直接用ocr识别会很糟糕。

  • 图片预处理

对图片进行灰度化,二值化,等距切割。

# coding=utf8
import cv2

def pre_img(file_name):  # 图片灰度,二值化处理
   img = cv2.imread(file_name, 0)
   img = cv2.threshold(img, 180, 255, 1)

以上是对图片进行灰度化以及二值化的处理程序,利用的opencv库,opencv的使用方法可以看它的官方文档,或者百度搜索相应的博客等等。

然后,图片变成这样的了:

软件介绍 全自动图形图片验证码识别工具。 在以前的互联网是没有验证码的,后来随着一些自动程序的出现(如自动注册邮箱、自动发布信息等),对网络的正常使用产生越来越严重的影响,便产生了验证码。 使用验证码的目的是通过一定的检测方式将自动程序和真正的用户区分出来,从而区别对待,保证真正用户的正常使用。验证码区别自动程序和真正用户的标准,是基于程序不具备人工智能(AI)这个条件之上的,基于这个思路,验证码可以有很多形式,比如根据照片说出动物的名字、看图识字(数字、字母、汉字)、听声音进行输入、对句子进行语意分析等等,都可在一定程度上实现验证码的作用,但综合考虑实现的成本、用户体验、破解的难度这些因素,目前使用最广泛的是看图识字这种形式,即图形验证码,就是根据图片上的数字、字母,用户再重新输入一遍,这种方式实现较为简单、用户使用方便、破解的难度相对较大。 现在在一些重要些的环节大多都有图形验证码进行保护,以前的自动程序由于验证码的保护而无法实现全自动化,这样就有了验证码识别的研究--图形验证码识别。 1、识别程序以dll的方式提供使用,通过简单的函数调用即可识别复杂的验证码图片。 2、自动识别; 智能处理各种背景、边框、干扰等; 3、识别率达80%-100%(指不太复杂的验证码),正确率高,本地图片识别速度一般0.1秒以内,安全可靠。 4、丰富的、简单易用的接口;可供多种可调用动态链接库的编程语言调用(vc、vb、delphi、 java、c#、vb.net、asp、模拟精 灵等),调用简单、灵活,可以通过传递文件名或图片数据流两种方式进行识别,提供函数调用说明及各种语言的调用具体实例。 5、完全绿色:绝不捆绑任何软件/插件,不用安装! 最近更新:最新的神经网络识别技术:识别率90%以上,识别速度0.1秒左右,不占用CPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值