基于矢量,掺杂矢量的角度值随机偏移和长度值随机偏移,默认的比例为角度: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