由于网页上的验证码图片都是通过程序产生的,因此,各个字母之间也都比较规则,进行识别其中的字符的话,也比较简单,只要将图片进行相减后,看看和那个字母的图片接近即可.
下面,我就那我们公司的外网邮箱:http://mail.lida-oe.com.cn的网页中的验证码为例子,我写了一个程序.
【网通】点击这里下载全部源程序 【电信、网通】点击这里下载源程序
【下载说明】
1、单击上面这个地址,打开下载页面。
2、点普通下载--等待30秒--点“下载”按钮--保存
整个程序的过程是这样的:
1 获取网页中的图片的地址,并下载到本地
2 对图像的像素中的A(透明度)值,来对图像进行二值化处理
3 对整个图片进行裁剪,仅裁剪出包含字符的区域
4 使用投影法对图像进行分割,从而保证每个分割区域仅包含一个字符
5 对分割出来的图片,再次进行裁剪,使得整个字符充满图片框,并大小一致
6 因此对分割出来的字符图片与图片库中的图片进行比较,相差最小的仅为字符.
我首先是搜集了多幅的验证码图片,以便能够得到所有的字符的图片. 然后,对这些搜集来的图片进行分割,从而得到包含26个字母的图片. 将这些图片作为图片库, 之后将从网页中获取的图片分割出来的字符图片,与此对比,从而得到识别结果.
截图如下:
获取网页中验证码图片之后,如上图。
将图片进行“二值化”之后的图片,如上图。
之后,对图片进行剪裁,如上图。
再使用投影法,分割出每个字符,如上图。
将分割出来的字符进行剪裁,如上图。
最终,通过与样本库的字符图片进行对比,识别出图片中的字母。
部分源程序:
主要源程序(由于做的比较急,并未对程序结构进行优化):
/*
* Created by SharpDevelop.
* User: Administrator
* Date: 2012-6-11
* Time: 11:46
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Windows.Forms;