工行验证码自动识别》(邹健)二

上一篇 / 下一篇  2007-01-20 09:30:36

以工行验证码为例:
https://mybank.icbc.com.cn/icbc/perbank/verifyimage.jsp?randomKey=1131106901245147136
我从网上下载了数十图片,并对其进行比较
  对比后发现图片中有一黑色框框,原本图片为66*20,除去框后变为64*18,其中共有4个数字,也就是说每个图片的大小大概是16*18象素,这样,我们就可以将一个大图,分成4个小图来辨认。

 

我们要解决的是:
1、每个数字后有杂线,如何去掉杂线
2、就算是同一数字样子也大为不同,大大防碍了计算机判断,如何判断数字的图片是什么数字

具体来谈:
1、分析:如何去掉杂线
  在这里在下引入一个概念:二值化:就是将一个东西进行一种处理,使其在处理后只具有两种情况,即类似(是/非)、(黑/白)、(1/0)、(好/坏)、(阴/阳)。
  因为这里是计算机中,所以我们采用0、1是最简单有效的。
  我在这里做了一个假设:假设图片中的颜色有一个临界值,在临界值两边的颜色,背景、杂线属于其中之一,而有效的数字则是另一类,二者用0、1表示,则可以达到图片的二值化。
  在不断的取色实验(将图片载入Fireworks或Photoshop中,并对单点进行取色)中,我发现比颜色&Hff555555浅的颜色都是背景和杂线,而比其深的都是数字本身。

(具体二值化方法本人将在下一章中介绍)
  由此,我们就将杂线去除了,杂线、背景都显示为0,而数字则显示为1。如果不明白我可以举个例子。
  读其中图片数为1623的:

在我做过二值化后则变为
000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000001111100000000
011111100000000000000000000000000000000111111000001100011
000000001000111000000000000001100000000000001111111100000
1000001100000010000011000000000001111100000000000011110000
10000010000011000000000000110000000000000111000000000000111
000000000000000001100000000000110000000000000011100000000000
1110000000000000000001000000000001100000000000000011100000000
00011100111100000000000110000000111100000000000000000111000000
000001111111111000000000100000000000001100000000000000011100
00000000011110001111000000010000000000000001100000000000000
11100000000000111000001110000001000000000000000011000000
000000001110000000000011100000111000001000000000000000
001100000000000000111000000000001110000011100001000000000
000000000110000000000000011100000000000011000001110000111
1111100001000001100000000000000011100000000000011100011100
0001111111100001000011000000000000000011100000000000001111
1111000000000000000000111110000000000000001111111000000000
0001111100000000000000000000000000000000000
  你对于这段01代码也许摸不着头脑,可是,经过以下分析后,你就会知道上代码是怎么回事了:
  由于一个0或1是代表一个象素点,而图片是64*18象素的。所以查一下上面01集合(当然,我们的记事本中有这个功能,我不会一个一个的查了,呵呵),我们的点大概是1152,计算1152我们会发现,哦原来是这样:1152=64*18。
  事情就是这么简单,下面我们将这0、1集合,按64列18行排一下
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000111110000000001111110000000
0000000000000000000000000111111000001100011000000001000111000000
0000000011000000000000011111111000001000001100000010000011000000
0000011111000000000000111100001000001000001100000000000011000000
0000000111000000000000111000000000000000001100000000000110000000
0000000111000000000001110000000000000000001000000000001100000000
0000000111000000000001110011110000000000011000000011110000000000
0000000111000000000001111111111000000000100000000000001100000000
0000000111000000000001111000111100000001000000000000000110000000
0000000111000000000001110000011100000010000000000000000110000000
0000000111000000000001110000011100000100000000000000000110000000
0000000111000000000001110000011100001000000000000000000110000000
0000000111000000000000110000011100001111111100001000001100000000
0000000111000000000000111000111000001111111100001000011000000000
0000000111000000000000011111111000000000000000000111110000000000
0000011111110000000000001111100000000000000000000000000000000000

  可以看出吗?隐隐约约有1623(由1组成的)。到此为止,我们已将图片转为数字了^-^。

2、分析如何判断数字
  以我多年来的经验,用以下方法就可以了,将图片先分为4份,即4个数字,先取其一进行二值化,与事先储存的01代码比较一下,若大致相同即可以判断相同。
  如动网论坛其标准图片与验证码中图片的相似度可以达到95%左右,也就是说,两图片对比,只要有95%以上相同就可以进行判断出正确的数字。
  我称以上方法为“物理比较法”,其准确性很高,但若数字形状有变化,那么此方法就无力回天了。
  在此种情况下,我提出另一种方法:逻辑比较法
  其实理论上“逻辑比较法”对于人来说要比“物理比较法”容易,因为人是判断数字是以它的形状而不是和一个标准的数字进一点一点的比较,看它们的相似度相差多少。
  数字的逻辑比较法,请详见《逻辑比较法及其应用》章节


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值