识别动网验证码和CSDN验证码的思路

动网的验证码

基于矢量,掺杂矢量的角度值随机偏移和长度值随机偏移,默认的比例为角度:10度和长度:10%

特点:

  1. 图片大小固定,默认80*20。数字个数固定,默认4,每个数字大小固定,默认20*20。
  2. 矢量随机角度值(默认随机量10°)和随机长度值(默认随机量10%比率)。最终图片根据随机后的点阵自动缩放大小调整。
  3. 有随机噪点。默认噪点比率:背景20%,数字10%。
  4. 噪点特征:Brightness > 50
  5. 数字可随机颜色。数字的Brightness均为50

识别思路如下:

1.去噪点

滤去所有Brightness不是50的点。这样会使数字上的噪点也被除去,造成数字失真。由于实际上采用的识别比对是基于统计的,所以关系不大。但也可以使用带权的中值滤波进行一定程度的修复。权值: 当前点 : 临接点 : 斜点 = 4 : 2 : 1 = 0.25 : 0.125 : 0.0625 。 将Brightness>50的点填充为白点,=50的点填充为黑点,存到数组中也可以只用bool或者 0/1表示

ps: 取 Brightness 的方法,请搜索 HSB/ HSV 的说明。.net 2.0中 Color.GetBrightness方法可以直接取到,结果值域 [0.0,1.0]

2.分块统计

将20 * 20的数字及其背景分为 5 * 5 个小块,每块包含16个像素点,存放在一个25个元素的数组。由于前面已经做过去噪,所以数组中可以仅仅存储该小块内包含的数字点的个数。

3.比对

将与数据库中存储的0~9十个数字的对应小块的点数值进行方差计算。与0~9中分块点数的方差最小的数字作为识别结果返回。

4. 数据库说明

数据库中的数据可通过学习统计而来。大约对每个数字统计100~200个左右的样本即可。

5. 分析

  • 优点:识别相当精确。目前的验证程序对于单个字母已经可以达到90%以上的准确率。对除2/7 、 6/8/9 数字对以外的数字可以达到 95%以上准确率
  • 缺点:中值滤波对数字轮廓有一定变形作用,滤波之后会可能导致变形过大的数字识别错误,但也可能会加强某些特征。比如2/7、6/8、8/9
  • 性能未进行测试,目前使用C#2.0,在粗糙的优化后,识别每个验证码的时间不超过1秒,4数字的识别率未测试。
  • 可能可以提高准确率的方法:
    • 记录方差的同时,记录学习数据的方差的平均值。识别比对时寻找方差与期望差值最小的进行比较
    • 合理使用中值滤波和旋转。把去方差最小的前三个识别数据,再进行旋转变换和中值滤波,使用原比对算法进行识别,预计可以提高图片识别的准确率到95%
    • 对于固定图片大小的,每次形状相同或者类似的验证码,均可以使用这个思路解决

 6.测试结果

未加中值滤波操作

对程序进行了100次识别测试,每次四个字符,正确89次,失败9~11次,其中错误12个字符,有两个1/2完全无法分辨,所以不能判断是正确还是错误,还有两个识别错误的,肉眼也同样很难分辨。

字符识别准确率在97%左右。个别字符,如3,4,7,0,没有出现错误,可以认为99%以上准确率。

可以认为总体识别准确率在90%左右。连续两次识别错误的概率在1%左右(测试时有两次连续两次识别错误 -_-!! )

错误字符如下:

识别错误统计

原字符

识别字符

出现次数

8 6 3 9 4 1 6 5 2 6 2 1 2 3 1 8 3 1 1 2 2 ( 不确定原字符为1还是2) 5 3 1 合计   10~12

测试识别消耗时间如下:

1 载入识别库     操作耗时:  31 ms ,     312500 ticks
2 网络抓取      操作耗时: 203 ms ,    2031250 ticks
3 保存        操作耗时:  31 ms ,     312500 ticks
4 识别        操作耗时:  31 ms ,     312500 ticks
0 全部操作      操作耗时: 296 ms ,    2968750 ticks

若只进行识别操作仅需100ms左右。

附本人测试机配置如下:

AMD Opteron 3000+ , 512M Ram (外频未知), 80 G ATA 133 HD , 网络为 ADSL 2M


 

CSDN验证码

特点:验证码位置随机,没有旋转。有噪点和干扰线,随机颜色的边框。字符颜色采用渐变色,斜体,大小无变化。相邻字符会发生粘连的情况。

识别思路:

  1. 去边框
  2. 去干扰线和噪点。
    • 仍然采用类似于上面的分析方法。去除S/B中某个域。即可以比较完美的去除所有的噪点和干扰线
    • 由于干扰都出现在背景中,处理完毕后的图像不会发生大的退化。这是比较弱的一个方面
  3. 识别
    1. 从左到右竖向扫描,查找第一个字符的位置,获取一个宽度内的像素点。
    2. 与数据库字符样本进行每个像素的比对或者特征点比对。由于字符没有变形和旋转,所以比对可以采用 == 进行。并统计不匹配点所占该样本点的个数的比率。最小的即为识别结果
    3. 根据样本数据库中记录的匹配样本的宽度,去除该宽度范围(需要考虑到斜体字符的倾斜角度)内的点,从当前点往后进行下一个字符的扫描。
  4. 分析
    • 优点:可以消除粘连字符的影响
    • 缺点:前面字符的识别结果会影响到后面的
    • 由于没有写程序验证,猜想速度可能会比较慢
    • 此种方法对字符本身无变形,位置随机的会有比较好的效果

 


 

其他验证码

QQMail / Gmail / Hotmail (怎么都是mail ^_^)的大变形验证码不要找我 ~_~

QQ Zone的没有仔细看过,可以一试

 


 

后记

现只对动网验证码写出了识别程序。辛苦所得,暂不公布源码 (*^__^*)

你可能感兴趣的:(图像处理)