‘小凡原创’栏目的所有文章

2008年10月26日 23:56

浅谈验证码的识别技术

这些天出于一些需要,要求做程序识别某网站的验证码,于是潜心研究了一番,颇有心得,特此分享。
验证码识别这项工作不适合浮躁的人,它需要足够的技术和耐心。由于此技术的特殊性,任何一个被公开识别技术的验证码都会很快地失效,相关网站都会很快地更换验证码。所以本文只介绍最简单的验证码的识别和识别原理。
—————————
首先我选择一个最简单的验证码,找来找去,就选挑战网的评论验证码作为例子吧。随便打开挑战网一篇文章,找到发表评论处的验证码,查看其属性,获得其生成地址“  http://tiaozhan.com/checkcode.php  ”。

 
显然,这是最简单的一类验证码:有固定的背景颜色,字符颜色,字体,连字符的坐标都是固定的。对于这类验证码,我们只需要对每个数字进行采样,建立标准库,然后应用的时候一一对照标准库,就可以轻易做到100%识别。
使用ImageCreateFromPNG函数把图片取回来,然后用imagecolorat函数取得每一个坐标点的色值,并且把第一个点的颜色确定为背景色。然后按照图像大小比例画一个表格,如果该单元对应的坐标颜色与背景色相同,不显示任何内容;反之显示黑色块。于是我们得到这样的分解图: 

 
可以观察到,数字所占区域的y坐标是6-15,四个数字所占区域的x坐标分别为3-10,12-19,21-28,30-37。
于是建立以0-9为样本建立10个二维数组($arr_eg[0] – $arr_eg[9]),该数组每一个元素均对应该数字区域的每一个坐标,如果该坐标色值与背景相同,值为0,反之为1 。这就是我们的标准库。
识别的时候,同样取得四个数组,与标准数组一一对照,就可以精确地把四个数字识别出来。
同时附上此验证码识别程序,供大家研究。(demo.php是程序;arr.php是标准库)
附件: secode.rar (1688 字节)
———————–
以上的例子虽然简单,但是已经把基本原理介绍清楚了,就是 采样->建立标准库->应用->对照标准库->识别。
但是,实际应用中,遇到的往往不是如此简单的情况。比如下面是稍微复杂的一类验证码,它的背景和字符都不是纯色,还有很多干扰点,但其字符的坐标都是固定的。 

 
首先我们对其进行去噪处理。就是首先把每个字符区域分割出来,按照出现的频率确定其主色值(字符的色值),然后去除与其相差大于一定程度的坐标,过滤之后得到目标所在的坐标数组,然后同样与标准库对照。但是这种情况下是不会精确吻合的,我们只能选择吻合度最高的昨作为结果。经过实践,识别率可以达到99%。 

 
再难一点的,就是下面这种:使用了变色、干扰点、干扰线、变位等几种用于干扰手段。

与上一种不同,它的每一个字符所在的位置是不确定的,这就需要我们自己去确定其位置,把字符所占据的大小固定的那一个小块切出来。首先把所有的干扰点和干扰线去掉(去掉之后字符是有所“误伤”的,通常会缺1-3个像素点),得到比较干净的图,然后用一条横向和竖线去扫描它(比较形象的说法,具体如何实现请自己思考),把扫到的没有出现颜色的横竖线全部去掉,把分析范围缩到一个较小区域。然后再用竖线扫描,根据颜色的出现与否,又得到5个小区域,每个小区域再用横线扫,除去空白,得到目标区域。得到的目标区域有时候会比标准区域小想办法补全,然后对照,按吻合率最高的原则得出结果。最后识别率达90%以上。 

 
再难一点。就是目前我研究的最难的一种了。如图,这种验证码除了干扰背景之外,每个字符的位置,大小,甚至字体都是不确定的。还好每个字符之间没有粘连。没有粘连就比较容易切字(当然要比上面那种难),切字之后字块大小不确定,所以很难建立标准库。我能想到的只有这样处理:切字之后对字块用横线或竖线扫描,根据其色块的坐标变化规律确定结果。目前正在实验中,能识别的字符还不完全,识别率也不甚理想。 

 
———————
验证码识别这个问题算是人工智能和计算机视觉领域的一个难题。作为破解者,总是会处于劣势地位,而且此技术带有一定的不正当性,没有太多的研究交流,因此要做得很好,是非常困难的。而且个人对于很多OCR的技术,理解有限得很,不敢在此乱写,只能利用有限的知识,抛砖引玉而已。
KuiGG   2008-10-26
QQ      727136
E-mail  i@kuigg.com

2008年04月2日 03:32

2008年愚人节记事

昨天太忙了。。以至于没有在昨天及时完成一篇文字。。拖到了今天凌晨。
 
2008年的愚人节,也许将会是很值得纪念的特别的一天。
 
早上,跟一位前辈交流,感觉他说的话很有道理,使我受益匪浅。以下是前辈说的一些话,记录在此吧:
=====================================================================================
前辈
你是个人才,要避免伤仲永的现象
前辈
三四年前,你可能是鹤立鸡群的
前辈
现在,会感觉平淡了一些
前辈
过两年,可能会开始着急
前辈
我给你点看法建议、问题可能在哪


 
前辈
你可能出现了一个问题,三四年前
前辈
你把你目光能看到的高峰就认为是真正的高峰了
前辈
以你当前的目光
前辈
那个时候,你是出离于传统与水平线之外的
前辈
但是,可能有点遗憾
前辈
我们的大的社会背景和教育背景只能去注意你、议论你,而无能力去开发和引导
前辈
这样,你自己在摸爬探索,在这个过程中磨砺,渐至会失去锋芒
前辈
可能会浪费了你的材质
前辈
你知道你的这几年
前辈
如果你有所得的话,得是什么,如果有所失的话,失是什么吗
前辈
这是你现在需要明白的关键东西
前辈
还有得和失的比较分析

得的 知识 金钱
失去的 时间 青春 有可能会失去大学的文凭
 
前辈

前辈

前辈
得和失都不准确,失尤其不准确
前辈
你的知识我还不了解

嗯 请您指教
 
前辈
难于做出评判
前辈
我们要知道一点
前辈
人的发展、事物的发展都存在一个路径和节奏问题
前辈
路径是必然的,它之中的各个节点是不可跨越的,可变化的只是某个节点的快慢节奏问题,以及不同节点的快慢的组合


 
前辈
这点,有很多词语描述的就是这点,比如厚积薄发、十年磨一剑,比如跨越式发展
前辈
路径对于你来说,要深刻了解的方面是,它是必然的。迈过每一个节点
前辈
至于节奏,是这样的,存在一个加速度
前辈
在不同的节点之间的阶段、它的加速度是不一样的,在正确的方向比较直线前行的话,加速度是越来越快的

嗯 有道理
 
前辈
这点,你现在也可能还没有很好理解
前辈
发展是这样的
前辈
首先,最好是走直线
前辈
如果说最佳模型的话
前辈
大方向和中方向都是明确清晰的
前辈
是真正适合自己的方向
前辈
然后,就象爬山,尤其是爬大山
前辈
层兰叠嶂的大山
前辈
你眼前的山蜂只是你的第一个高峰,也同时是你的第二个台阶
前辈
爬上了第一个山峰,就眼前豁然开朗的是第二个山峰,你的第二个高蜂,底二个高峰的落差可能比第一个高峰的更大
前辈
而你爬它却可能需要更短的时间,因为你更好的爬山状态和准备
前辈
爬头一两个山峰,更需要的是积累、塌实、持之以恒,如果你的人生发展有5个山峰的话
前辈
如果你有超常的激情或者才智,最智慧的方式是,自己清晰它,然后一定程度上压制它
前辈
因为你所说的还不是真正的激情,也不是真正的方向 [...]

2008年03月31日 17:31

羊肉泡馍 以及其它吃的

写完上一篇文章,发现该去买菜了。又要吃饭了。那今天就写些关于吃的文字吧。
昨天又到康桥苑去吃了一碗羊肉泡馍,因为学锋不回家吃饭,而且酋长大人答应请客。
我第一次知道“羊肉泡馍”这个名词,就是03年刚来到交大的第一个星期,某日,某西安土著同学和我在康桥二楼吃饭,他要了一碗羊肉泡馍,然后告诉我这是西安最具盛名的食物,还很慷慨地分给了我一块羊肉(那一碗里就两块羊肉,直到现在还是)。最后,他还说了句,“…………,不过这里的泡馍不正宗”。
过几天我自己买了一碗,觉得吃起来还不错。其实这东西就是把面饼切碎了扔到羊肉汤里面泡,煮开。
再后来,到老孙家吃过所谓正宗的羊肉泡馍,觉得味道并不如康桥二楼的令我喜欢。
在西安呆的几年里,每隔一段时间我都要吃一次康桥二楼的羊肉泡馍。
自打03年从广西出来,5年间也到过不少地方,吃过不少东西,让我觉得好吃并且印象深刻的并不多。粗略想来有以下:
北大家园的水煮鱼。05年夏天,第一次到北京,北大的同学请我在家园吃了一餐,其中有一道菜叫水煮鱼,我印象极其深刻。我一般不吃辣,但是那水煮鱼是放了很多辣椒的,盆里能看见的地方都漂满了红色的辣椒油,更有胡椒孜然等一类我不喜欢的调料,但我居然吃得特别起劲。我几乎一个人把一盆水煮鱼给吃完了。那段时间逢人就说,北大的鱼好吃。但是后来,我回到西安在别的地方吃到理论上烹饪更为精良的水煮鱼,却难以下口。再后来,我再到北大,虽然心里很想念05年的水煮鱼,却也不再到家园去吃过——生怕它已经不那么好吃了。
人大小食堂的碗蒸牛肉。也是05年夏天,在人大居住过一段时间,曾有几次到一个小食堂(我不知道它确切的名字,只知道是一个比较精致的小规模的食堂,跟交大的小豆花差不多),吃过一个菜,是一个小碟子,装了几块牛肉,样子跟我们做的扣肉差不多,应该是蒸出来的。很好吃。其实它好吃的原因不仅是烹饪有方,更多的应该是因为它少,你刚刚觉得它好吃,就已经没了。而且价格不菲,一点点牛肉,11块钱一碗。想一次要几碗来过过瘾,在那时来说并不现实。05年之后,我再没有去过人大,虽然路过了很多回。那座本来就很小的校园,对我来说已经是一个空园。
交大东南门对面百姓家园的酱骨头+富贵牛腩。那年我还是一个农村里来的穷小子。一个有钱的女生在那请我吃了一餐饭,那是我第一次知道,两个人在一起吃个饭是能够花费上百元的。有句话说,“我奋斗了十八年才能和你坐在一起喝咖啡”,我想我那时候明白这句话的含义。那里的特色菜就是酱骨头和富贵牛腩,确实很好吃。
东新科贸旁边的小苏塘坝鱼。第一次吃小苏塘坝鱼,是几年前的一天到西安科大去看一个高中同学,他就近请的中午饭。那时这个店比较小,也比较破,位置是在今天百脑汇的地方。当时就觉得,这鱼做得怎么那么好吃,连跟鱼炒的魔芋都那么好吃。这几年里,小苏的店搬迁到了对面一个富丽堂皇的所在,店面扩大了好几倍,塘坝鱼的价钱也从18块涨到了26块,但依然好吃。这应该是我请朋友吃饭去的最多的地方了。
然后就是康桥二楼的羊肉泡馍了。哈哈。很朴实很不正宗的泡馍。说不出4块钱一碗的,只有两片羊肉的泡馍为什么会好吃。我离开西安的日子里,唯一想念的食物。
最后就是我最近特别喜欢做的一道菜,炒鱼排。应该是前一个星期,我整整一个星期每天晚上都吃这个菜。后来给诺日朗、王婧祎还有挑战的孩子们,以及学锋吕园园做过,大家都赞不绝口。。
今天吃什么。。这是个问题。。。。。。。

2008年02月6日 17:38

过年了。。。

第一次不在家里过年三十。。
也可以说是第一次在自己家里过年
 
贴了一副春联:
事业辉煌腾云起
前程锦绣迎春来
 
 
祝愿自己在新的一年里事事顺利。。

2007年09月27日 18:41

Happy birthday to Google

 

刚刚才发现Google的logo换了,还不明白是因为什么,看了一下logo的路径文件名(http://www.google.cn/logos/9th_birthday.gif),才知道是Google在庆祝自己生日。
 
小凡敬贺Google九年大寿,望多多发钱才是,哈哈。

2007年09月27日 15:25

天冷了,冬天就要来了

 
连下了两天雨,一层秋雨一层寒啊
 
梧桐树叶子落了,阳台上的花也死了
 
日子就这样匆匆逝去……

2007年09月23日 02:47

马云钱多,人傻,快去赚他的钱啊

哈哈
马云钱多,人傻,快去赚他的钱啊
 

 
 

2007年09月18日 00:28

14-16号,直播青春版《牡丹亭》

14-16号,在宪梓堂有青春版《牡丹亭》的第106场义演,我奉团委之命,和陈平等人一起对其做现场直播,因此可以没有票坐在中间位置观看了整场戏。
第一次真正看戏,看了三个晚上,总共九小时下来,居然能不看字幕听懂不少昆曲。
牡丹亭的故事主要就是讲一个官家小姐私自游园,在石头上打了个瞌睡,居然做了场春梦,醒后思念梦中情郎,竟郁郁而终。临死前画了幅自画像,题了首诗,藏在那石后。
巧的是那梦中情郎也在同时作了个春梦,梦见那小姐,进京赶考途中又在石下拾得那小姐自画像,竟害了花痴。
阴司判官怜惜那小姐,准她遇到情郎后还阳。她魂魄来到世上,与那情郎幽会,上演一场人鬼情未了。随后就是情郎掘墓,让那小姐回魂复生。再后来就高中状元,有情人终成眷属。
 
故事跟三言二拍里面那些才子佳人类的故事差不多,也算是俗套。但戏曲表演得不错,尤其声音很好听。
 
用手机随便乱拍了几张照片,效果很差,拍舞台的基本都是一篇灯光白,也有相机拍的,懒得发上来了。
 
我的电脑拿去做直播了;

直播中……  旁边是中英文字幕,英文翻译比较扯淡,“九泉之下”可以译作”nine springs”。不过没注意拍下来

开场前,那角落里是复杂的声音发生系统

我们的机器

剧终男女主角谢幕,拍了也看不见

 
 
 

2007年09月17日 23:50

买了个新手机,回归CDMA……

13号去钟楼逛,看见CDMA的预存话费送手机(这个活动常年都有,常年都是特价),又想买个手机重新用一次CDMA。
最后交了1990元话费拿了个三星的手机,感觉不错,130万像素的摄像头,送2G的内存卡。
这是销售给我试拍的一张照片

我回家路上又拍了几张,感觉效果也只是马马虎虎,而且我手总是有点抖
 

 

 
选号的时候我本想用原来的13379223323,联通查了说那号已经不属于我了,只好新开一个
153号段只剩下惟一一个,我就拿了。
回来后拿电脑用蓝牙连手机,通过手机无线上网,感觉很不错,速度挺快的。
 
 

2007年09月7日 22:51

iis命令行

Microsoft在安装IIS的时候同时安装了一个工具,叫 iisreset,你可以在winnt\system32 中找到它,他可以和PING一样以命令行方式使用。它有多个参数,下面是几个重要的,也是我们本文切题的参数:
/RESTART 停止后启动IIS
/START 启动IIS (如果停止)
/STOP 停止IIS (如果启动)
/REBOOT 重启电脑
/REBOOTONERROR 如果停止IIS失败重启电脑
/NOFORCE 不用强迫IIS停止
/TIMEOUT:X 在X秒后, IIS被强制停止,除非 /NOFORCE 参数给出.如果 /REBOOTONERROR 给出, 它重启电脑.