简单验证码的模板匹配实现

时间:2022-09-18 07:39:42

摘要:验证码是伴随自动提交程序的出现而出现的,其初衷是预防恶意程序的大量登录,随着互联网IT技术的不断发展,验证码已成为网站和网民交互的一个特征。国内外都有对验证码的设计和识别的研究,该文以一类常见验证码为例进行了实际的识别实现。

关键词:验证码;模板;实现

中图分类号:TP393文献标识码:A 文章编号:1009-3044(2011)26-6375-02

验证码是论坛等网站用以阻止自动提交程序恶意行为的人机区分技术,其设计和使用直接涉及到互联网的正常浏览体验。在信息化社会这个背景下,随互联网IT技术的不断发展,验证码的发展是非常迅速的。现在各种论坛、博客、投票等程序都带有验证码功能。

目前,网络流行的验证码有很多种,从人工和机器识别两个角度分析,主要有以下4类:1)人工难以识别、机器容易识别;2)人工容易识别、机器容易识别;3)人工难以识别、机器难以识别;4)人工容易识别、机器难以识别;

验证码识别技术的研究,其目的就是设计并应用IV类验证码。但是国内实际使用的验证码中,尚无特别符合标准IV的实例[1]。

国内对验证码识别的研究较少,文献2将神经网络算法引入验证码识别技术中;文献3提出了简单的基于字符形状的验证码识别技术;文献4探讨了一种基于外部轮廓的数字验证码识别方法;文献5提出了一种加权模板的构造方案。本文以常见的直立、有杂色的验证码为例进行实际的识别实现,这种验证码图片内的字母及数字分布均匀,图片背景一般为纯色,目前在大量论坛及网页游戏、个人网上银行中应用。

1 研究方法

通常验证码的识别需要涉及图像处理和人工智能、模式识别、机器视觉的基本知识。图像处理一般指针对数字图像的某种数学处理,如投影、钝化、锐化、细化、边缘检测、二值化、压缩等等。二值化:一般图片都是彩色的,按照逼真程度可能很多级别。为了降低计算复杂度,方便后续的处理,在不损失关键信息的情况下,能将图片处理成黑白两种颜色;细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能大于1。不同的细化算法,可能有不同的差异,比如是否更靠近线条中间,比如是否保持联通行等;边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断,也可能是自适应的。门限可能是图像全局的,也可能是局部的。简单验证码的识别对象如图1所示。

其识别过程包括图像采集、预处理、识别几个方面,具体对应以下4个步骤:1)取出字模;2)二值化;3)计算特征;4)对照样本。

2 技术实现

以VB6.0为开发平台,用WebBrowser控件载入带有简单类型验证码的网页、imagebox控件保存验证码图片。使用doAuen()函数复制验证码图片并保存到本地,调用doClear()、doComp()方法生成验证码,调用doPost()方法提交。

图像采集过程使用for each语句遍历WebBrowser1.Document.All,将tagName转换为大写字母与“IMG”匹配,以其id与验证码图片匹配。Vb提供了createControlRange()方法用于非文本元素选择区域,该方法返回一个controlRange集合,有add()方法用于添加元素,execCommand()方法用来对当前页面或选定区域或指定区域执行命令[6]:

Set ctrl = WebBrowser1.Document.body.createControlRange()

ctrl.Add (Dov)

ctrl.execCommand ("Copy")

Dov元素为验证码图片元素。execCommand 方法需要一个字符串参数指示所要进行的操作,此参数可以是任意能执行的参数关键字,Copy参数将选定区域复制到剪贴板。

SavePicture 语句可以从对象或与其相关的Picture 、Image控件属性中将图形保存到文件中,完成图像的采集,其语法有两个参数,第一个参数为产生图形文件的 PictureBox 控件或Image 控件;第二个参数是文件路径:

SavePicture Clipboard.GetData, App.Path & "\tmp.bmp"

Clipboard 类提供可以方便地与系统剪贴板相互传输数据的静态方法,GetData从剪贴板检索指定格式的数据。

动态装载图片的VB方法是LoadPicture(),参数为图片文件名的全称及路径。对图所示验证码图片进行分析,宽度为80像素,高度为20像素,字符位置基本均匀,所以简单地将图片切割为4部分分别进行预处理。

图片的预处理过程为3次遍历:依像素对图片进行第一次遍历,忽视白色背景,将字符色与干扰色存入数组id,同时将颜色值出现次数存入数组nums,两者一一对应,用一个游标参数flag指示数组长度。VB的Picture.Point(i, j)方法,可以按照像素坐标获取位图的颜色值。对于任一像素,如果颜色值不为16777215(白色),则从nums(0)到nums(flag)遍历数组id进行匹配,如果颜色值不存在则将此颜色项同时添加到数组id和nums并进行相应的游标操作;如果颜色值已经存在,将其nums数组储存的数值加1。

第二次对nums数组进行遍历找出最大值,与其下标相同的id数组项的值即要识别的实际字符颜色;

第三次遍历对像素采样并进行二值化,将目标色置1,其它颜色统一置0,生成二值化数组。

遍历预处理数组生成二值化字符串,计算特征串,最简单的方法是去掉串头尾的字符0。将特征串存入本地文件,每个特征串一行,并将特征串对应的字符附加到串末尾。

Vb的open语句可以操作顺序、随机以及二进制文件。打开顺序文件的语法是open pathname for [Input|Output|Append] as [#]filenumber [len=buffersize],参数表示文件名,可以包含驱动器和目录;参数Input表示从打开的文件中读取数据,以这种方式打开文件时,文件必须存在,否则会产生错误;参数As[#]filenumber 子句为打开的文件指定文件号,对文件进行读写操作时,要用文件号表示该文件,文件号是介于1~511之间的整数,可以是数字、变量,也可以省略不用。顺序文件的按行读取语句为Line Input #,该语句从打开的顺序文件中读取一行数据。

Open App.Path & "\list.txt" For Input As #1

Do While Not EOF(1)

Line Input #1, t

If InStr(s, Mid(t, 1, Len(t) - 1)) > 0 Then

singleC = Right(t, 1)

End If

Loop

Close #1

遍历特征库,如果特征串在二值化串中的子串位置大于0,即匹配成功。取出此特征串末尾的字符,即单个字符的识别结果。

3 小结

互联网作为基础型平台,在提供大量信息及应用的同时,验证码给信息化及社会信息化带来的影响是深远的,它影响着用户的体验,影响着应用抵抗恶意攻击的生存能力,乃至影响着整个软件业生产方式的变化。在此背景下,研究验证码的自动识别、探索相关验证码技术,其重要性是不言而喻的。基于字符特征串匹配的验证码识别方法基本能做到100%识别率,而且特征库小、识别速度快。其缺点是验证码适用对象单一,没有涉及到专业的图形图像处理算法。

参考文献:

[1] 文晓阳,高能,夏鲁宁,荆继武.高效的验证码识别技术与验证码分类思想[J].计算机工程,2009.

[2] 左保河,石晓爱,谢芳勇,等. 基于神经网络的网络验证码识别研究[J].计算机工程与科学,2009.

[3] 朱绍文,陈光喜.一种简单的基于字符形状的验证码识别技术[J].桂林电子科技大学学报,2010.

[4] 潘大夫,汪渤.一种基于外部轮廓的数字验证码识别方法[J].微计算机信息,2007.

[5] 王虎,冯林,孙宇哲.数字验证码识别算法的研究和设计[J].计算机工程与应用,2007.

[6] MSDN. controlRange Collection [EB/OL]./en-us/library/ms537447(v=vs.85).aspx,2011.

上一篇:Samba技术实现跨平台资源共享 下一篇:一种XML多分支树结构的查询算法