基于Python语言和支持向量机的字符验证码识别
作者:杨雄
来源:《数字技术与应用》2017年第04
        摘要:验证码的主要目的是区分人类和计算机,用来防止自动化脚本程序对网站的一些恶意行为,目前绝大部分网站都利用验证码来阻止恶意脚本程序的入侵。本文以某高校教务系统的字符验证码作为研究对象,利用图像处理的方法,对验证码图像进行二值化、去离散噪声、字符分割、归一化、特征提取、训练和字符识别等过程实现了验证码识别,并使用Python语言实现。最后在分析识别结果的基础上,从验证码识别的角度提出生成更加安全验证码的一些建议。
        关键词:支持向量机(SVM);验证码;Python语言
        中图分类号:TP3 文献标识码:A 文章编号:1007-9416201704-0072-03
        1 引言
        随着互联网的迅速发展和应用,网络为我们提供了越来越多的资源,也为我们的生活和工
作提供了极大的便利,但同时也带来了大量的互联网安全问题,比如刷票、用户批量注册、密码暴力破解、社区恶意发帖等。
        验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写[1],是能够区分用户是人还是计算机的公共自动化程序,该程序提出的问题由计算机生成并评判,但必须只有人类才能回答。由于计算机无法解答验证码的问题,所以可以认为能够回答出问题的用户就是人类。目前大部分学校的教务系统都采用了字符图像验证码。
        支持向量机(SVM)是在统计学习的 VC维理论和结构风险最小化(Structure Risk MinimizationSRM)原理基础上,发展起来的一种全新的机器学习算法[2]。该算法在解决小样本、非线性及高维模式识别中有许多特有的优势。支持向量机根据其求解问题的不同分为支持向量分类机和支持向量回归机两种类型。本文提出的验证码识别算法是基于C-SVC的支持向量分类机[3]
正则化匹配26个字母python
        但随着网络技术的发展,最初的字符图像验证码已经不能够完全保障网络的安全,为了评估这类验证码的安全性,需要从识别角度进行研究。因此,本文以某高校教务系统使用的
验证码作为识别对象,提出一种基于SVM的验证码识别算法,使用Python的图像处理库和SVM机器学习库来实现验证码识别程序,根据识别率来评估网站的安全性,从而提出一些改进意见。
        2 验证码预处理
        为了防止计算机自动化脚本的攻击,字符图像验证码往往由服务器产生随机字符序列后再加入一些干扰因素使计算机难以识别。本文将要识别的验证码示例如图1所示。
        可以看到,该类验证码加入的干扰因素主要是点线干扰噪声,其加大了图像识别的难度。因此,在进行验证码识别前,需要对验证码图像进行预处理,步骤包括二值化、去除离散噪声、字符分割和尺寸归一化。
        2.1 二值化
        图像的二值化处理就是将图像上的点的像素值设置为0255,使图像的集合性质只与像素值为0255的点的位置有关。将图像中所有小于阀值的像素被判定为属于字符区域,其像素值设为0 而大于或等于阀值的像素被排除在字符区域以外,像素值设为255。对图像
验证码进行二值化处理的关键是阈值的选择与确定。二值化处理[4]选取阈值方法很多,经过实验比较,本文采用全局固定阈值法[5]选取阈值,然后再对验证码图像进行二值化处理。
        设原始灰度图像为fxy),二值化处理后的图像为gxy),则二值化过程可表示为:
        式中fxy)是原始图像坐标为(xy)的点的像素值,gxy)是二值化处理后的该点的像素值,0表示黑点,255表示白。在实际的处理系统中,进行图像二值化处理的关键是要确定合适的阈值,使得字符与背景能够分享开来,而且结果图像必须具备良好的保形性,不能够丢掉原来有用的信息,不产生额外的空缺等。通过实验,采用固定阈值80能够得到较完美的效果。
        使用Python语言实现的主要步骤包括:将RGB彩图转为灰度图和将灰度图,再按照设定阈值转化为二值图。
        二值化后的验证码示例如图2所示,基本将背景噪声去除了。
        2.2 去除离散噪声
        经过二值化处理后,验证码图像还存在或多或少的离散噪声,尤其在字符周围。本文消除验证码字符周围离散噪声采用的是连通域去噪法:当发现一个像素值为0的点时,记为:A,统计点A周边九宫格里的像素值同样为0的像素点数量,记为:SumA),如果SumA)少于一个定值K,则认为此点为孤立点,将其排除在字符区域以外,将点A像素值设为255。经过实验,当K值取2时,能够去除绝大部分的离散噪声,得到较好的效果。
        在具体处理时需要将所有的像素点按如下图分成三大类:顶点X、非顶点的边界点Y和内部点Z。如图3所示。
        其中:X类点需要计算周边相邻的3个点,Y类点则需要计算周边相邻的5个点,而Z类点则计算周边相邻的8个点。
        经过去除离散噪声操作的验证码图像如图4所示,已经去除了给绝大部分干扰噪声。
        2.3 字符分割
        字符图像验证码本质是由一系列的单个字符图片拼接而成。将去除离散噪声后的验证码图片放大到像素级别,可获取各个字符位置参数信息:整个图片大小是 40*10(单位为像素)
,单个字符大小为 7*10,字符间隔3个像素,左相距1个像素,右相距1个像素,字符上下相距0个像素,如图5所示。
        这样就可以使用投影分割算法将验证码图像分割成只包含单个字符的图片,只需要定位每个字符在整个图片中所占据的像素区域,然后就可以根据像素位置进行分割,分割后的单个字符图片如图6所示。
        2.4 尺寸归一化
        本文所选择的研究对象进行字符分割后单个字符的尺寸已经统一为7*10的规格,所以不需要做额外处理。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。