首页 > 编程知识 正文

识别患者的方法有哪些,验证码在线识别

时间:2023-05-04 01:36:40 阅读:151725 作者:1507

本文由作者xhdzxc授权的网易云社区发布。

欢迎来到网易云社区。 我想知道更多关于网易技术产品的运营经验。

完全自动区分计算机和人的图灵测试(completelyautomatedpublicturingtesttotellcomputersandhumansapart,简称CAPTCHA ),俗称验证码,是用户通过计算机进行识别的验证码的主要目的是强制人机交互免受机器自动化攻击,为了保证服务器系统的稳定和用户信息的安全,越来越多的网站采用验证码技术。 图像认证码是目前最常用的,本文也主要讨论该认证码的识别。

最近在爬虫类项目中遇到了验证码。 机器需要自动识别并绕过。 这些认证码大多分辨率低,本身信息量少。 通常,加入一个或多个噪声因素,包括各种背景噪声、噪声点像素、字体失真和重叠、字符位置随机化和个数不确定、颜色反转等。 在网上查阅资料和文献后,分别采用OCR识别和模板匹配方法识别不同类型的认证码。 主要过程可分解为三个步骤:1.图像清理,2 .字符切分,3 .字符识别。 以下结合工作经验和调查内容,说明常用的验证码识别方法和过程。

1 .图像清理

图像清理是指通过灰度化、二值化、干涉点清理等过程获得相对干净的图像数据,为下一步机器学习或模板匹配做准备。 具体例子如下表所示。

1.1彩色噪声消除

计算机使用最多的RGB颜色空间分别对应红、绿、蓝三种颜色,通过调节三种分量的比例构成各种颜色。 以最常见的32位颜色为例,一个分量用8位表示,最大值为255,灰度意味着构成颜色的三个分量相等。 原始彩色图像中包含的信息量最大,如果二维码图像中存在利用颜色对比度的噪声或线条,最好在此阶段进行初步清理。 一个比较简单的处理方法是使用3*3矩阵对图像进行平滑。 也就是说,对每个像素取他所在的3*3矩阵的所有点的RGB平均,分别作为新的RGB值。 稍微优化一下,将3*3矩阵中RGB三维欧式距离最接近平均值的点作为新值。

1.2灰度化

彩色电视系统通常使用名为YUV的颜色空间。 在此,y表示亮度信号,对于人眼来说,亮度信号(y )是最敏感的。 将彩色图像转换为灰度图像时,只需转换亮度信号并保存即可。 从RGB到YUV空间的y变换有一个著名的心理学公式: Y=0.299R 0.587G 0.114B。

实际上,将系数缩放为1000倍,实现整数运算。 gray=(r*299g*587b*114500 )/1000。 请注意,该除法是整数的除法,所以需要加上500进行四舍五入。 这个公式的另一个简化变种也很流行。 gray=(r*30g*59b*1150 )/100。 更快的算法采用移位而不是除法,因此可以将系数缩放为2的整数的幂,进行右移位操作。 从精度和速度方面来看,这个整数取7是最合适的。 gray=(r * 0.299 *2^ 7g * 0.587 *2^ 7b * 0.114 *2^7)7=) r*38g*75b*15 )7) 7

1.3二值化

为了简化下一步的计算,需要将灰度图像转换为黑白二值图。 默认值大于127的像素点设定为白色,其馀像素点设定为黑色。 当然,该阈值也需要根据图像的实际情况进行计算调整。 一般使用直方图统计来决定动态阈值的方法,以白地黑文字直方图左边的谷的位置为阈值,以黑地白文字直方图右边的谷的位置为阈值,很好地区别背景和文字。

以图a、图b为例,对应直方图分别为直方图a和直方图b,图a对应的动态阈值为127,图b的动态阈值为241是合适的。

1.4底色统一

黑底白文字的图像时,需要如上图b所示转换为白底黑文字。

1.5清洁干扰点

在黑白二值图像的噪声去除阶段,常用的噪声去除方法为连通性噪声去除,通常为使用互连的八向连通dqdxf计算互连点的数量,并且如果dqdxf点的互连点的数量小于预定阈值,则认为这些点都是噪声点。 这种简单粗暴的清扫方法通常非常有效。

双字符分隔符

在这个阶段,对预处理后的图像进行切断处理,对整个图像中每个孤立的文字主体部分进行位置和分离。 主要采用x轴和y轴投影的方法,计数相应坐标上黑像素点的数量。 对图像得到的x轴和y轴的投影分别如下。 通过x轴投影,可以剪切单个字符,并分别使用y轴投影剪切顶部和底部的空白部分。

3.OCR软识别

我们使用开源的OCR识别引擎Tesseract。 它最初由惠普实验室开发,后来为开源软件业做出了贡献,并通过谷歌进行了优化和重新发布。 调用代码和识别效果如下。

api=tesseract.TessBaseAPI () api.Init )、'.'、' eng '、tesseract.OEM_TESSERACT_ONLY ) )初始化api.S

etPageSegMode(tesseract.PSM_SINGLE_LINE) #设置为单行字符串模式api.SetVariable("tessedit_char_whitelist", whitelist) #设置白名单stringOCR = tesseract.ProcessPagesBuffer(mBuffer, len(mBuffer), api)

 
 

该方法的优点是:开发量少;比较通用,适合于各种变形较少的验证码;对于扭曲不严重的字母和数字识别率高。缺点也很明显:对于扭曲的字母和数字识别率大大降低;对于字符间有粘连的验证码几乎难以正确识别;很难针对特定网站的验证码做定制开发。
 


4.模板库匹配
4.1 建立字符模板库
首先需要针对目标网站收集大量的验证码;然后根据上一章节的方法,进行图片清理;最后按照固定的长宽值切分出字符模板图,保存文件名带上对应字符的标记。

 
 

4.2 字符匹配
首先,把目标验证码图片按字符个数切分,这里的图片切分方法必须与模板制作时的切分方法一致,得到与模板图同样大小的字符图。接下来通常的做法是使用汉明距离或编辑距离定义相似度,并用KNN方法得到K个最相似的字符,最后从K个字符中选取出现次数最多的那个作为匹配结果。参考了文献[1]中K取值和字符识别率的变化关系(如下图)。
 

   
   

然后,我们把K取值为5。并且把相似度重新定义为:matchScore = dotMatch^2 / (dotCaptcha * 清爽的飞机),其中dotMatch为验证码字符图与模板图对应位置都是黑色点的个数,dotCaptcha为验证码字符图中黑色点个数,而清爽的飞机为模板图中黑色点个数。取这个分母是为了防止某些黑色点较多的模板图在匹配度计算中始终得到较大值。识别效果如下表:    

 


   

该方法的优点是:原理简单直观;可以针对不同网站定制优化;对于扭曲的字母和数字识别率较高。缺点是:开发量大,需要定制开发;需要收集大量的字符图片库;字符变化很多的情况,匹配次数增加速度下降;对于字符有粘连的图片识别率低;

5. 支持向量机  
支持向量机通俗来讲是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。实际应用上,往往遇到的是非线性可分得情况,因此通过核函数把低维向量映射到更高维空间,使得样本满足线性可分。  
验证码识别问题实际上是其中单个字符识别问题,而在字符可穷举的情况下,比如只有英文字符和数字,单个字符识别问题其实是一个分类问题。一个英文字母或数字表示一类,而验证码中切分后得到的单个字符需要被机器自动分到某一类。一般情况下,把单个字符的灰度图片转成整形数组,数组的每一个元素表示图片的一个像素,即一个特征维度。我们切分得到的图片大小为10x16=160像素,即有160个特征,当特征数量多且特征之间关系不明确时,采用支持向量机分类比较合适。  
 LIBSVM   是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用。该软件还有一个特点,就是对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数就可以解决很多问题;并且提供了交互检验(Cross Validation)的功能。主要参数使用:多类别(C-SVC=0),radial basis function(kernel_type=2),训练和预测代码如下。对于      这样轻微变形的验证码,有字母和数字共36个类别,收集训练样本共778个字符图的情况下,单字符预测准确率接近100%:
 

labels = []samples = []for ch in captchaTemplate.keys():    for table in captchaTemplate[ch]:        labels.append(ord(ch))        samples.append(map(lambda e:e/255., table))problem = svm_problem(labels, samples)model = svm_train(problem, '-t 2 -c 500')print len(samples)data = map(lambda e:e/255., list(Image.open(TESTFILE).getdata(TESTFILE)))y = ord('z')prediction = svm_predict([y,], [data,], model)print prediction

该方法的优点是:无需设计快速的图像匹配算法;只要图片切分方法合适,对于扭曲倾斜的字母和数字识别率也较高;并且可以针对不同类型的验证码做定制优化。缺点是:支持向量机原理比较复杂,无法直观解释,需要了解支持向量机等机器学习方法。

6. 神经网络
  以上验证码识别都依赖于字符切分,切分的好坏几乎直接决定识别的准确程度。而对于有字符粘连的图片,往往识别率就会低很多。目前验证码识别最先进的是谷歌在识别“街景”图像中门牌号码中使用的一套的算法。该算法将定位、分割和识别等几个步骤统一起来,采用一种“深度卷积神经网络”(deep convolutional neural network)方法进行识别,准确率可以达到99%以上。谷歌拿自有的reCAPTCHA验证码做了测试,结果发现,对于难度最大的reCAPTCHA验证码,新算法的准确率都达到 99.8%,这可能也好于大多数人为验证。  
验证码作为一种辅助安全手段在Web安全中有着特殊的地位,了解验证码识别的方法和原理,不仅有利于绕过验证码抓取网站内容,而且有利于设计更安全合理的验证码。
 


 

网易云安全(易盾)行为式验证码超10亿次完美验证,坚固守卫网站安全第一道防线。网易云易盾提供新一代网站验证码,包括智能验证码、滑动验证码等形式,验证码接口稳定性 99.9%,感知威胁可智能切换验证难度,告别繁琐验证,保护业务安全,点击可免费试用。

 


                

参考资料:

[1] 《高效的验证码识别技术与验证码分类思想》

[2] 《验证码的识别与改进》

[3] Tesseract项目:http://code.google.com/p/tesseract-ocr

[4] 常见验证码的弱点与验证码识别:http://drops.wooyun.org/tips/141

[5] http://blog.csdn.net/v_july_v/article/details/7624837

[6] http://www.codeproject.com/Articles/106583/Handwriting-Recognition-Revisited-Kernel-Support-V

[7] http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html

 




相关文章:
【推荐】 flex布局之flex-grow和flex-shrink如何计算
【推荐】 用双十一的故事串起碎片的网络协议(中)
【推荐】 手把手带你打造一个 Android 热修复框架(上篇)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。