163相册验证码图片的识别手记之二 --- 识别

声明: 此文章只是记录我在处理163相册验证码图片识别过程时的想法思路,在此发表只是纯粹基于技术探讨目的.因此在文章中不会提供任何源码下载!!任何人利用这里介绍的方法所做任何事情而出现的责任本人概不负责!!如果需要转载此文,请注明原作者和出处!!

 

识别验证码一般是要经过“去干扰”,“切字”,“识别”三步处理。

 

一、切字

切字即是将图片里的每个验证码都分别“切”开,这样才能进行下一步的验证码识别,并且“切字”切出来的“字”顺序也关系到识别出来的字符顺序,比如以下验证码样例图片:

  

 

则应该需要切出“7”,“4”,“3”,“7”,“7”五个字图。

 

对于不同的验证码图片,“切字”的方法也不尽相同,如对于一些验证码出现位置固定的验证码图片则可以直接从图形中分析出字坐标,再进行“切字”即可。而对于一些采用了“变位”干扰的验证码图片(如163相册的)就不能采用固定坐标来“切字”了,并且对于某些字符相连的验证码图片(如Google的),“切字”比“去干扰”还更头痛!!(-_#碰到这类的验证码图片,我一般放弃。咔咔!)

 

对163相册验证码图片进行“切字”其时还是很简单,因为验证码字符之间是没有任何相连,只是采用了“变位”干扰,但对于这种图形使用“去白拆分法”(嘿嘿,这方法名是我自己名的命)则基本是万能方法。

 

去白拆分法:

也就是先将空白的头尾行/列去掉,再按空白列拆分为多个子图,再将这几个子图的头尾空白行/列去掉,经过这几步处理后,那些拆分出来的子图就是最终“切”出来的验证码字图了。

 

1,去白:去除验证码图片的头尾空白行/列

比如上面的验证码图片(为了便于说明我在画板程序中打开样例图并将图形放大了6倍和显示网格):

 

去空白的头尾行/列则是将下面的黄色区域都去掉,只留中间部分。

 

经过“去白”处理后,图形就变成了如下样式:

 

2,拆分 : 按空白列拆分图形,如下图根据红线部分拆分就基本将所有验证码字图(7,4,3,7,7)都“切”出来了,如图:

但要注意,经过上面折分后字图里也还是包含有空白的头尾行,所以也要“去白”处理,如下图:(也就是将那些黄色区域去掉)

 

经这样处理后的“字图”就可以用于识别了:)

 

注意:对于某些被干扰破坏得很严重的图形,在进行“去白拆分”操作时要确保“切”到的字图高宽度为“源数字图”的大小

如下图中的“5”字:

 

二、验证码识别

当经过“去干扰”,“切字”处理后,识别就是一个很轻松的工作了。一般采用图形结构“相似度比较法”进行识别,这样对于一些在“去干扰”时就破坏了结构的字图(如上面图片中最后二个“7”字)也可以识别出来,但也因为是对图形结构进行“相似”比较,所以就存在有识别失败的可能性。

 

相似度比较法

此方法是将每个“切”出来的字图和所有源数字图逐一比较,并得出一个图形结构的相似度值,然后再取相似度值最高的“源数字图”,这样“字图”对应的字符就识别出来了。

 

图形结构相似度

假如将一幅图看成一个二维数组(一维下标对应X轴,二维下标对应Y轴),数组里的数据就是每个象素点的颜色值。那么求两副图图形结构的相似度值,则是等价于求两个二维数组里的数据的相似度统计。

 

假如有两个数组的数据分别如下:

二维数组A里的数据:("4"字的01图)

Code

 

二维数组B里的数据:("4"字被干扰破坏后的01图,注意红色部分)

 

Code

 

求A与B的相似度,则分别比较AB对应“行”里的数据,找出不相同点的数量,也就是共有3次不相同,所以相似度值大概为96% ,因此就可以认为B是A了。

注:对于相似度取什么值就可考虑AB“相等”,这个大家要权衡一下,毕竟取的值过低识差率可是很大的。

Tag标签: 验证码识别
posted @ 2008-08-07 22:55 Kingthy 阅读(2938) 评论(19)  编辑 收藏 网摘 所属分类: C#

  回复  引用  查看    
#1楼2008-08-07 23:19 | 谢小漫      
继续支持ing。
基本的都来,会放代码吗?

  回复  引用  查看    
#2楼[楼主]2008-08-07 23:25 | Kingthy      
@谢小漫
谢谢支持。抱歉,代码不提供。

  回复  引用    
#3楼2008-08-07 23:37 | 大城小格[未注册用户]
学过图像处理的基本掌握。

用灰度累计的方法,对y轴进行灰度求和,曲线最小值就是切割点。太简单了。

  回复  引用  查看    
#4楼2008-08-08 00:07 | Steven Chen      
--引用--------------------------------------------------
大城小格: 学过图像处理的基本掌握。

用灰度累计的方法,对y轴进行灰度求和,曲线最小值就是切割点。太简单了。
--------------------------------------------------------
继续ing.............

  回复  引用  查看    
#5楼2008-08-08 02:04 | 荔橙伊珊雨      
关注.
  回复  引用  查看    
#6楼2008-08-08 08:02 | 雅阁布      
收藏!!
  回复  引用    
#7楼2008-08-08 08:47 | 左右[未注册用户]
理论上现在实际使用中的验证码都没这么简单的,有的验证码连我们自己去看都看不清,让代码怎么识别得了!
  回复  引用  查看    
#9楼2008-08-08 09:21 | egmkang      
@左右
严重同意.
那次我注册gmail,搞了半天,愣是没看清楚验证码是什么,让电脑怎么识别??

  回复  引用  查看    
#10楼[楼主]2008-08-08 09:34 | Kingthy      
@大城小格
终于看到想要的回复了,希望高手出招...

@egmkang
@左右
每种验证码识别方法都基本不会通用的.对于太变态的图像还是放弃好了.

  回复  引用  查看    
#11楼[楼主]2008-08-08 09:36 | Kingthy      
@说不得
多谢提供!!!我的英文不好.看起来很吃力.不知有没有哪位兄弟能翻译一下?

  回复  引用  查看    
#12楼2008-08-08 09:49 | mafa      
谁知道有扭曲的话怎么弄?现在验证码一般都这样了吧
  回复  引用  查看    
#13楼2008-08-08 09:51 | 菜菜灰      
非常好~
  回复  引用  查看    
#14楼2008-08-08 10:17 | T.t.T!Ck.¢#      
@mafa
扭曲的时候不要再弄回来了
收集一定的样本,去除干扰,利用人工神经网络来做直接的识别

  回复  引用  查看    
#15楼2008-08-08 13:03 | hoodlum1980      
这样只能针对干扰简单的验证码。真正的验证码,几何变换不仅仅是偏移,还有旋转,缩放。比如QQ的验证码我觉得就是即使人也不容易识别的。
  回复  引用    
#16楼2008-08-08 14:43 | wo yao[未注册用户]
代码啊
  回复  引用  查看    
#17楼2008-08-08 17:48 | 曲欧      
继续更深入点...支持
  回复  引用    
#18楼2008-08-08 22:59 | Svn[未注册用户]
不错不错,我曾经也写了一个识别的代码,原理跟你的类似。但不是根据相似度识别的。比你的稍微简单些 。

http://www.svnhost.cn/Project/Detail-8.shtml

  回复  引用    
#19楼2008-08-29 15:02 | dtdtdt520[未注册用户]
写得很好

识时应加上被去的点,如5字那样放弃就可,识别率>80%就可。

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1263293




相关文章:

相关链接: