动网的验证码
基于矢量,掺杂矢量的角度值随机偏移和长度值随机偏移,默认的比例为角度:10度和长度:10%
特点:
- 图片大小固定,默认80*20。数字个数固定,默认4,每个数字大小固定,默认20*20。
- 矢量随机角度值(默认随机量10°)和随机长度值(默认随机量10%比率)。最终图片根据随机后的点阵自动缩放大小调整。
- 有随机噪点。默认噪点比率:背景20%,数字10%。
- 噪点特征:Brightness > 50
- 数字可随机颜色。数字的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验证码
特点:验证码位置随机,没有旋转。有噪点和干扰线,随机颜色的边框。字符颜色采用渐变色,斜体,大小无变化。相邻字符会发生粘连的情况。
识别思路:
- 去边框
- 去干扰线和噪点。
- 仍然采用类似于上面的分析方法。去除S/B中某个域。即可以比较完美的去除所有的噪点和干扰线
- 由于干扰都出现在背景中,处理完毕后的图像不会发生大的退化。这是比较弱的一个方面
- 识别
- 从左到右竖向扫描,查找第一个字符的位置,获取一个宽度内的像素点。
- 与数据库字符样本进行每个像素的比对或者特征点比对。由于字符没有变形和旋转,所以比对可以采用 == 进行。并统计不匹配点所占该样本点的个数的比率。最小的即为识别结果
- 根据样本数据库中记录的匹配样本的宽度,去除该宽度范围(需要考虑到斜体字符的倾斜角度)内的点,从当前点往后进行下一个字符的扫描。
- 分析
- 优点:可以消除粘连字符的影响
- 缺点:前面字符的识别结果会影响到后面的
- 由于没有写程序验证,猜想速度可能会比较慢
- 此种方法对字符本身无变形,位置随机的会有比较好的效果
其他验证码
QQMail / Gmail / Hotmail (怎么都是mail ^_^)的大变形验证码不要找我 ~_~
QQ Zone的没有仔细看过,可以一试
后记
现只对动网验证码写出了识别程序。辛苦所得,暂不公布源码 (*^__^*)