爱收集资源网

简单验证码图片的宽度和宽度H20/20

网络整理 2023-09-30 19:03

简单验证码是指验证码图片里的字符,固定不变,或者变化很小的验证码,比如:字符上会有一些干扰点干扰线等情况,或者只有少数几种字体变化和字体大小变化。

这里给出源代码都是极其简单的源代码,学过《C程序设计》的都可以读懂,不会超出书本范围,而且不使用表针,这样VB,Delphi,JAVA 等语言都可以照此写出相应的源代码。

验证码识别可以分为三个大的步骤:预处理,分割,识别。预处理又可细分为读取图片,二值化,去干扰点,去干扰线等等步骤。

读取图片很简单就是把要辨识的验证码图片读取到我们的程序里,网络上常见的验证码图片格式有BMP,JPG,GIF,PNG,其中BMP的图片格式种类好多,但都不复杂,24位BMP格式最简单,除去54字节的文件头,只须要次序读取BMP文件的字节信息就可以了,256色的也就是8位的BMP格式也很常见,256色BMP图片在文件头后多一个索引表,后面也是次序储存图片信息的。JPG,GIF,PNG的格式都复杂一点,不过网上都有这种公司或组织发布的source code。

下面以24位BMP格式的源代码进行说明:

#define W 40 //定义验证码图片的长度

#define H 20 //定义验证码图片的长度

#define N 4 //定义字符位数,一般是4位

#define BMP_filename "c:\\test.bmp"

int x,y,i,s,temp;

int YZM[W][H]={0};

int YZM_red[W][H]={0};

int YZM_green[W][H]={0};

int YZM_blue[W][H]={0};

int rec[W]={0};

int lf[N],rt[N],up[N],dw[N];

char result[N];

FILE *fp=fopen(BMP_filename,"rb");//以二进制只读方法打开BMP文件

for(i=0;ifor(y=H-1;y>=0;y--)//BMP图片数据是逆序储存的,据说是为了下载显示便捷,呵呵

for(x=0;x//依次读取每位象素的RGB值

fclose(fp);//关闭文件

好的,通过以上几个句子就可以把图片信息读取到程序的字段里了,然后对其进行二值化,去干扰等工作。

二值化就是把刚刚读取的RGB信息,转换成01数据,0表示空白背景,1表示字符。

for(x=0;x{

if(YZM_red[x][y]*0.3+YZM_green[x][y]*0.6+YZM_blue[x][y]*0.1//red*0.3+green*0.6+blue*0.1 是估算照度的公式

//如果图片里有干扰点,可以用下边的句子清除。

for(x=1;x{

if(YZM[x][y]==1 && YZM[x-1][y-1]==0 && YZM[x][y-1]==0 && YZM[x+1][y-1]==0 && YZM[x-1][y]==0 && YZM[x+1][y]==0 && YZM[x-1][y+1]==0 && YZM[x][y+1]==0 && YZM[x+1][y+1]==0)YZM[x][y]=0;

//如果一个点的值是1,而且它的周围8个点的值都是0,那么这个点就是干扰点

经过这种预处理工作就可以得到一个二进制链表数据了。我们以一组普通的验证码图片为例,

5165 4436 5591 5999 6323 6008 5166 4427 3278

for(y=0;y

我们可以用前面的输出句子进行输出,输出句子在最终的程序中可以删掉或则注释掉。

输出结果如下:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0

0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0

0 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0

0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0

0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0

0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0

0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0

0 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0

0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

for(x=0;x{ s=0;

for(y=0;yif(s>0)rec[x]=1;else rec[x]=0;//rec记录字段的断连情况

for(i=0,x=1;xfor(i=0,x=1;xfor(i=1;i

java 验证码去干扰线
相关文章