前面介绍了基于模板库匹配的方法,本篇进一步讨论倾斜字符的验证码识别,以阿里通
的验证码示例。它的验证码URL为:http://account.alicall.com/fujiae.asp?0.436909
19899381697,后面一串数字是随机数。验证码显示效果如图1 所示:

分析验证码
观察该验证码可发现如下特征:
① 它的大小为72像素×18像素,由 4个纯数字组成
② 验证码为单一的色彩,但存在干扰像素,需要先滤除
③ 观察左上和右下的数字 1,可知数字存在一定的倾斜,但倾斜程度有限,不会越界
到另一个字符的区域
④ 每个数字都固定在18×18的区域内
识别该类验证码的可采用如下方法:首先将验证码分割成若干区域,然后分别统计特定
区域内有效像素的总数。在匹配时,寻找各区域内总数差异最小的字符即可。
示例验证码中,虽然数字产生了一定的倾斜,但位于上部的像素点,却仍旧是处于图片
的上部,如图2所示:

像素点的大体分布是没有改变的。因此我们可以考虑统计上方18×9方格的深色点的总
数,再统计下方18×9 方格的深色点的总数。以此作为比对的依据。
本文作为示例,我们将一个数字横向分割为上、中、下三部分,分别统计像素点个数;
在纵向上分割为左、右两部分,统计像素点个数。
根据此基本方法,使用VB6.0 编写一个简单的识别程序。
程序主窗体的基本布局如图3 所示:

所添加的 4个按钮如表格所示:

2 个 PictureBox 从上至下分别是:Picture1,Picture2,将它们的 ScaleMode 属性都
设置为 3-Pixel,使用像素作为长度单位。
此外,添加一个Microsoft Internet Transfer控件,用于下载验证码, Name默认Inet1。
添加一个用于显示识别结果的 Label,Name 设置为 LblResult。一个用于输入字符串的
TextBox ,Name 设置为TxtChar。我们把字符串输入到这个文本框,点击“写入文件”按钮
可将当前 4个数字的统计结果写入Settings.INI文件。
除噪采用的方法在以前的文章中已介绍:一个点周围的 8 个点若都不是黑色点,说明
该点是孤立的噪点,直接将其颜色设定为白色。
首先为“下载”按钮添加的简短代码:
Private Sub CmdDown_Click()
'下载按钮暂时变为不可用
CmdDown.Enabled = False
'声明用于保存图片二进制数据的数组
Dim picBytes() As Byte
picBytes =
Inet1.OpenURL("http://account.alicall.com/fujiae.asp?0.43690919899381697",
icByteArray)
While Inet1.StillExecuting
DoEvents
Wend
'将图片数据写入Test.bmp文件
Open App.Path & "\test.bmp" For Binary As #1
Put #1, , picBytes
Close #1
'将 Test.bmp载入 Picture1
Picture1.Picture = LoadPicture(App.Path & "\Test.bmp")
'按钮恢复可用
CmdDown.Enabled = True
End Sub
用户每次单击“下载”,都将下载一张新的验证码图片,并显示到Picture1控件中。
二值化是将原先的彩色图片转换为黑白两色的图片。原图中深色点设置为黑色,浅色的
点设置为白色。颜色深浅由其 RGB 值来筛选。示例程序采用 40 作为临界值。参考下面的代
码:
Private Sub CmdClear_Click()
'二值化和除噪
Picture2.Cls
'把原图装入Picture2
Picture2.Picture = Picture1.Picture
Dim X As Integer
Dim Y As Integer
Dim Ret
'深色点置黑,浅色点置白 |