简单图形验证码的识别

合集下载

图片验证码识别原理

图片验证码识别原理

图片验证码识别原理
图片验证码识别是指通过计算机技术识别出图片中所包含的验证码内容。

其原理基于图像处理和机器学习算法。

以下是图片验证码识别的一般步骤:
1. 预处理:对验证码图片进行预处理,如去噪、二值化、灰度化等操作,以便后续处理。

2. 分割字符:对预处理后的验证码图片进行字符分割,将每个字符单独提取出来,以便后续识别。

3. 特征提取:对每个字符进行特征提取,通常使用的方法是将字符转化为数字矩阵表示或提取轮廓等特征。

4. 建立模型:使用机器学习算法建立验证码字符识别模型,常用的算法包括支持向量机、随机森林、神经网络等。

通过将提取的特征与模型进行训练和学习,使得模型能够准确地识别不同的字符。

5. 验证码识别:将待识别的验证码字符经过预处理、分割和特征提取后,输入建立好的模型进行识别,输出对应的字符。

6. 后处理:对识别得到的字符进行后处理,如去除噪声、纠正错别字等操作,以提高识别的准确性。

图片验证码识别在实际应用中面临着一些挑战,如干扰线、噪声、扭曲等干扰,需要通过优化算法和模型来提高识别准确性。

此外,为了防止机器自动化攻击,验证码图片的设计也会进行不断的升级和改进。

验证码识别原理及实现方法

验证码识别原理及实现方法

验证码识别原理及实现方法验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。

目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。

所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

我们最常见的验证码1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。

2,随机数字图片验证码。

图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。

没有基本图形图像学知识的人,不可破!3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。

4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。

简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片.这四种样式,基本上能代表2中所提到的验证码类型,初步看起来第一个图片最容易破解,第二个次之,第三个更难,第四个最难。

真实情况那?其实这三种图片破解难度相同。

第一个图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。

第二个图片,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。

第三个图片,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。

看似无法突破这个验证码,本篇文章,就一这种类型验证码为例说明,第四个图片,同学们自己搞。

第四个图片,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。

图形验证码原理

图形验证码原理

图形验证码原理
图形验证码是一种常用的验证方式,用来判断网站或应用程序的用户是否为真实用户而非机器人。

它的原理是通过展示给用户一个包含一定规则的图形或图像,要求用户根据特定的规则进行判断或操作,以验证用户的身份。

一种常见的图形验证码是要求用户识别并选择指定类别的图像,比如选择所有包含车辆或交通信号灯的图像。

这种验证码的目的是通过识别真实世界中的对象,来区分人类用户和机器人。

这样一来,只有具备人类视觉识别能力的用户才能成功通过验证码。

还有一种常见的图形验证码是要求用户识别图像中的文字或数字,并将其输入到相应的文本框中。

这种验证码的难度通常较低,要求用户识别出简单的文字或数字,以验证用户是真实用户而不是自动化程序。

图形验证码的设计中通常会采取一些技巧来增加安全性,防止机器人通过暴力破解或自动化算法绕过验证码。

比如,验证码图像可能会通过扭曲、干扰线、干扰点等方式,增加识别难度。

此外,验证码图像每次生成都会随机选择,使得攻击者难以事先准备对应的验证结果。

总之,图形验证码通过提供给用户一些视觉难题或识别任务,来验证用户的真实性。

它是一种有效的防止机器人或恶意程序攻击的方式,被广泛应用于各类网站和应用程序中。

图片验证码识别打码软件使用教程

图片验证码识别打码软件使用教程

图片验证码识别打码软件使用教程目录一、简介 (2)二、运行原理 (2)三、菜单功能 (3)四、使用流程 (6)五、注意事项 (9)一、简介其实图片验证码识别打码软件是依托一个验证码自动识别平台,根据用户及软件开发者的需求进行平台对接之后自动将软件遇到的验证码进行自动的识别,从而减少验证码给双眼带来的压力,节省验证码识别的时间。

其中可以自动识别输入的验证码有数字,字母,数字字母组合,汉字等,但是特殊类型的需要与客服沟通。

在目前国内已有的验证码识别的技术的基础上,加入验证码题库,大大提高了验证码识别的准确率。

像比较常见的就是对接好答题吧打码平台进行电脑打码。

二、运行原理1、答题打码平台开发研究要重点研究了用于字符识别的BP神经网络、卷积神经网络和形状上下文算法,给出详细的推导。

2、采用分段线性变换去除图像模糊,利用局部OSTU二值化,得到了比全局阈值更好的分割结果。

对传统的投影分割法改进,提出了极小值分割算法,有效解决了验证码字符粘连的问题。

并采用简化后的卷积神经网络进行字符训练和识别,达到了99.1%的高识别率。

3、聚类算法和竖直投影结合的方式完成分割,解决了字符叠加和粘连的难题。

对单个字符以简化后的卷积神经网络进行训练和识别,识别率达到了53%。

4.对已有的难以分割的验证码,提出了基于形状上下文整体识别验证码的方法,破解率达到了27.7%。

这种整体识别的思想也给其他较难分割的验证码提供了一个新的识别思路。

三、菜单功能1、识别测试在对接操作之前,让用户进行免费测试了解平台的识别准确率的窗口。

将用户名,密码进行填写之后上传测试的图片验证码就可以进行测试识别。

(ps:在线识别测试只支持普通英文、数字或者汉字验证码,选择题及特殊类型请联系客服)2、VIP体系详细介绍了不同的VIP等级享受的福利不一样。

基本上是充值的越多,送的也就越多。

一般来说,识别验证码的价格是十分的划算的。

3、价格类型1)识别验证码类型纯数字,纯英文字母,字母数字组合,纯汉字,数字英文汉字三混合。

常见的数字验证码识别方法

常见的数字验证码识别方法

常见的数字验证码识别方法
数字验证码识别是指识别数字验证码的过程,通常用于防止恶意注册、登录等行为。

以下是几种常见的数字验证码识别方法:
1.OCR识别:OCR识别是指使用光学字符识别技术对验证码中的字符进行识别。

OCR识别通常使用计算机视觉技术,通过分析图像中的像素点和线条来识别字符。

OCR识别速度快、精度高,但对于扭曲、变形、模糊等情况的识别效果较差。

2.人工神经网络识别:人工神经网络识别是指使用人工神经网络对验证码中的字符进行识别。

人工神经网络识别通常使用卷积神经网络(CNN)或循环神经网络(RNN)等深度学习模型,通过训练数据集来学习字符的特征,并进行识别。

人工神经网络识别准确度高,但需要大量的训练数据和计算资源。

3.基于规则的识别:基于规则的识别是指使用预定义的规则对验证码中的字符进行识别。

基于规则的识别通常使用模式匹配、字符串匹配等方法,通过匹配字符与预定义的规则来进行识别。

基于规则的识别速度快、易于实现,但对于复杂的验证码效果较差。

以上是几种常见的数字验证码识别方法,每种方法都有其适用范围和优缺点,需要根据具体的场景和需求选择合适的方法。

图片验证码识别

图片验证码识别
{
for(x=0;x<W;x++){YZM_red[x][y]=fgetc(fp);YZM_green[x][y]=fgetc(fp);YZM_blue[x][y]=fgetc(fp);}
//依次读取每个像素的RGB值
}
fclose(fp);//关闭文件
好的,通过以上几个语句就可以把图片信息读取到程序的数组里了,然后对其进行二值化,去感扰等工作。
for(i=0,x=1;x<W-1;x++)if(rec[x-1]==1 && rec[x]==1 && rec[x+1]==0){i++;rt[i]=x;}//计算每个字符的右边界
for(i=1;i<=N;i++)for(x=0;x<W;x++)for(y=0;y<H;y++) if(x>=lf[i] && x<=rt[i] && YZM[x][y]==1)YZM[x][y]=i;
FILE *fp=fopen(BMP_filename,"rb");//以二进制只读方式打开BMP文件
for(i=0;i<54;i++)temp=fgetc(fp);//跳过54个字节的文件头数据
for(y=H-1;y>=0;y--)//BMP图片数据是倒序存储的,据说是为了下载显示方便,呵呵
我们可以用上面的输出语句进行输出,输出语句在最终的程序中可以删除或者注释掉。
输出结果如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

图片验证码识别打码软件使用教程

图片验证码识别打码软件使用教程

图片验证码识别打码软件使用教程图片验证码识别打码软件使用教程目录一、简介 (2)二、运行原理 (2)三、菜单功能 (3)四、使用流程 (6)五、注意事项 (9)一、简介其实图片验证码识别打码软件是依托一个验证码自动识别平台,根据用户及软件开发者的需求进行平台对接之后自动将软件遇到的验证码进行自动的识别,从而减少验证码给双眼带来的压力,节省验证码识别的时间。

其中可以自动识别输入的验证码有数字,字母,数字字母组合,汉字等,但是特殊类型的需要与客服沟通。

在目前国内已有的验证码识别的技术的基础上,加入验证码题库,大大提高了验证码识别的准确率。

像比较常见的就是对接好答题吧打码平台进行电脑打码。

二、运行原理1、答题打码平台开发研究要重点研究了用于字符识别的BP神经网络、卷积神经网络和形状上下文算法,给出详细的推导。

2、采用分段线性变换去除图像模糊,利用局部OSTU二值化,得到了比全局阈值更好的分割结果。

对传统的投影分割法改进,提出了极小值分割算法,有效解决了验证码字符粘连的问题。

并采用简化后的卷积神经网络进行字符训练和识别,达到了99.1%的高识别率。

3、聚类算法和竖直投影结合的方式完成分割,解决了字符叠加和粘连的难题。

对单个字符以简化后的卷积神经网络进行训练和识别,识别率达到了53%。

4.对已有的难以分割的验证码,提出了基于形状上下文整体识别验证码的方法,破解率达到了27.7%。

这种整体识别的思想也给其他较难分割的验证码提供了一个新的识别思路。

三、菜单功能1、识别测试在对接操作之前,让用户进行免费测试了解平台的识别准确率的窗口。

将用户名,密码进行填写之后上传测试的图片验证码就可以进行测试识别。

(ps:在线识别测试只支持普通英文、数字或者汉字验证码,选择题及特殊类型请联系客服)2、VIP体系详细介绍了不同的VIP等级享受的福利不一样。

基本上是充值的越多,送的也就越多。

一般来说,识别验证码的价格是十分的划算的。

易语言验证码识别中级方法源码

易语言验证码识别中级方法源码

易语言验证码识别中级方法源码
一、简单验证码识别
1、验证码样式
我们先从简单的纯数字或纯字母的验证码开始,可以认为这种验证码没有太多的变化,所以可以用简单的方法来识别。

2、对比与识别
要从图片中识别出验证码,首先我们需要将图片里的字符转化为可以计算机能识别数字和字母的形式,然后做简单的对比,以此来识别出验证码。

3、变量设置
我们可以使用python中的图像处理库处理图片,处理的结果就是得到图片的每个像素的值,以及每一行和每一列的长度,以及字符的高度、宽度等。

4、图片处理
接下来,就是处理图片,将从图片中得到的字符拆分成每个字符作为一个独立的图片,然后将图片转换成灰度图,以便接下来能够进行简单的字符识别。

5、特征提取
接下来,我们在每个字符的灰度图上提取特征,这里使用的特征是“黑点数”,也就是说,我们要计算出每个图片里黑色像素的数量,然后将结果存储在一个数组中。

6、模型训练
接下来就是训练模型了,我们可以使用Knn模型或者其他的模型,模型就是根据上一步提取出来的特征,学习出图片里面的字符,是数字还是字母,还有准确的字符是什么。

二、中级程序验证码识别
1、验证码样式。

验证码识别原理及实现方法

验证码识别原理及实现方法

验证码识别原理及实现方法一、验证码识别的原理:1.图像处理:首先需要对验证码图像进行预处理,包括二值化、去噪声、字符分割等。

二值化将图像转化为黑白图像,去噪声可以通过滤波方法去除图像中的噪声干扰,字符分割将验证码中的字符分离出来,以便后续进行特征提取和识别。

2.特征提取:特征提取是一个关键的步骤,通过提取验证码图像中的关键特征,以区分不同字符或图像。

常用的特征提取方法包括边缘检测、形状描述子、颜色特征等。

边缘检测可以提取出字符的轮廓信息,形状描述子可以描述字符的形状特征,颜色特征可以描述字符的颜色分布情况。

3.分类器训练:在特征提取之后,需要构建一个分类器来对提取的特征进行分类。

常用的分类器包括支持向量机(SVM)、卷积神经网络(CNN)等。

分类器的训练过程是通过使用已知标注的验证码图像数据集进行训练,学习出一个可以识别不同字符或图像的模型。

4.识别:在分类器训练之后,就可以使用该模型对新的验证码图像进行识别了。

识别过程就是利用已训练好的分类器,对待识别的验证码图像进行分类判断,最终输出识别结果。

二、验证码识别的实现方法:根据验证码的特点和难度不同,有多种方法可以实现验证码的识别。

以下是其中几种常见的实现方法:1.基于模板匹配的方法:对于一些简单的验证码,可以通过将每个字符或图像对应的模板保存下来,并与待识别图像进行匹配。

模板匹配的方法简单直观,计算速度也较快,但对于复杂的验证码效果较差。

2. 基于机器学习的方法:对于一些复杂的验证码,可以使用机器学习算法进行识别。

通过构建特征向量和训练样本,使用分类器进行分类判断。

常用的机器学习算法包括支持向量机(SVM)、随机森林(Random Forest)等。

3.基于深度学习的方法:深度学习在图像识别中有着很好的效果,对于复杂的验证码,可以使用卷积神经网络(CNN)进行识别。

CNN可以自动学习图像中的特征,较好地解决了特征提取的问题。

综上所述,验证码识别是通过图像处理、特征提取和分类器训练等步骤来实现的。

验证码原理

验证码原理

验证码原理验证码(Verification Code)是一种用于确认用户身份或者防止恶意攻击的安全技术手段。

它通常以图形、文字、数字或者声音等形式呈现,要求用户根据提示进行输入或者操作,以验证其身份或者完成某项操作。

验证码的原理是基于人机识别的技术,通过要求用户完成特定的任务来确认用户的身份或者意图,从而提高系统的安全性。

验证码的原理主要包括以下几个方面:一、图形识别。

图形验证码是最常见的一种验证码形式,它通常以扭曲的文字、数字或者图案的形式呈现给用户,要求用户根据提示输入相应的内容。

图形验证码的原理是利用计算机生成扭曲的图形,使得机器很难识别其中的内容,但对于人类来说相对容易识别,从而实现了人机识别的差异化。

二、声音识别。

除了图形验证码,声音验证码也是一种常见的形式。

它通过播放一段语音内容,要求用户根据内容进行相应的操作,比如回答问题或者输入特定的内容。

声音验证码的原理是利用声音的特征,要求用户进行相应的识别和回应,从而确认用户的身份或者意图。

三、数字识别。

数字验证码通常以数字的形式呈现给用户,要求用户进行输入或者计算。

比如简单的加减乘除运算、数字序列填充等形式。

数字验证码的原理是利用数字的特性,要求用户进行相应的计算或者输入,从而确认用户的身份或者意图。

四、行为识别。

除了以上几种形式,还有一种行为验证码,它要求用户进行特定的操作,比如拖动滑块、点击特定区域、摇晃手机等。

行为验证码的原理是利用用户的操作行为,通过特定的操作来确认用户的身份或者意图。

总的来说,验证码的原理是利用人机识别的差异,通过要求用户进行特定的任务来确认用户的身份或者意图。

它可以有效防止恶意攻击、刷票、注册机等行为,提高系统的安全性。

随着技术的发展,验证码的形式也在不断创新和改进,以适应不同场景和需求的安全验证。

验证码技术的应用将会越来越广泛,成为网络安全的重要保障手段。

验证码识别教程

验证码识别教程

验证码识别教程醉若星原创好久没写教程了,今天放上一个教程,就是教你如何做一个识别验证码的教程,比较实用,特别是想干坏事的时候。

-_-!!!好了,废话就不说了,直接就开始我们的教程吧。

现在网上关于验证码的识别的教程相对来说比较少,在这里我就写一个比较简单的,其实对于验证码的识别的话原理其实都差不多。

具体是怎样的,大家往下看就明白了~~~第一部份图片的组成及特征码的定义做为验证码的识别,那我们首先需要了解的就是基本的原理,这里就是先说清楚这个原理,再往后大家看代码就比较容易明白了(其实本来就比较简单,我说这么多就是为了大家看完不说我的水平次罢了。

再次爆汗~!)正题了,其实整个验证码的识别的话我们先得分解一个图,每一个图形其实都是由每一个点和每一个点来组成的,说到每个点其实就是一个色块,当每一个色块拼接起来就成了一个图形,这个虽然说有点废话,但我还是提一下。

需要更好的理解我们来看图:图一图二通过上面的两幅图片我们就能很清楚的知道色块情况了,每一个小块就是一个色块,有些用白色来表示,而整个图的点则也是通过坐标来识别的,X,Y两个点,这样我们就不难分清行和列了,当我们取色块X1,Y1就是指取出第一行,第一列,如果我们取色块为X2,Y5则是指第五行,第二个色块。

呵呵!色块了解了,我们可以通过取色块中的颜色来做为一个比较和判断的识别标准。

我们对一个图中的数字进行取色,当颜色的值为黑色(0)时,我们将点记录为1,当所取的点值为白色(255)时,我们将点记录为0。

这样整张图取下来,我们就会得到一个字符串,格式如下:000000000000000000000000000000000000000000000000000000000000000000000000000 000000011111111111111110000111111111111111100110000000000000000111100000000000000 0011110000000000000000111100000000000000001111000000000000000011110000000000000 000111100000000000000001111000000000000000011001111111111111111000011111111111111 110000000000000000000000000000000000000000000000000000000000000000000000000000000000上面的这段类似二进制的字符串就是我们从图一中提出来的东西了,我们称这一个字符串为这张图片的特征码。

使用OCR技术识别图形验证码

使用OCR技术识别图形验证码

使⽤OCR技术识别图形验证码⼀、OCROCR,即Optical Character Recognition,中⽂叫作光学字符识别,是指通过电⼦设备检查打印在纸上的字符,通过检查暗、亮的模式确认字符形状,然后通过字符识别⽅法将形状转换成计算机⽂字的过程。

那么对于图形验证码来说,它都是⼀些不规则的字符,但是这些字符确实是由字符稍加扭曲变换得到的内容。

爬⾍过程中难免会遇到各种各样的验证码,⽽⼤多数验证码还是图形验证码,这时候我们可以直接⽤ OCR 来识别。

⼆、整体代码逻辑2.找到⽤户名输⼊框,输⼊⽤户名;3.找到密码输⼊框,输⼊密码;4.找到并截取验证码图⽚,转化为图⽚对象;5.预处理验证码图⽚,去除噪声;6.识别验证码,得到识别结果;7.去除识别结果中的⼀些⾮字母字符和数字字符;8.找到验证码输⼊框,输⼊验证码结果;9.点击“登录”按钮;10.等待“登录成功”的字样出现,如果出现就证明验证码识别正确,否则重复以上步骤。

# -*- UTF-8 -*-"""@File:test.py@Description:@Author:echohye@Date:2022/02/03 18:11"""import timeimport reimport tesserocrfrom selenium import webdriverfrom io import BytesIOfrom PIL import Imagefrom retrying import retryfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom mon.by import Byfrom mon.exceptions import TimeoutExceptionimport numpy as npdef preprocess(image):image = image.convert('L')array = np.array(image)array = np.where(array > 150, 255, 0)image = Image.fromarray(array.astype('uint8'))return image@retry(stop_max_attempt_number=10, retry_on_result=lambda x: x is False)def login():browser.get('https://captcha7.scrape.center/')browser.find_element(By.CSS_SELECTOR, '.username input[type="text"]').send_keys('admin')browser.find_element(By.CSS_SELECTOR, '.password input[type="password"]').send_keys('admin')captcha = browser.find_element(By.CSS_SELECTOR, '#captcha')image = Image.open(BytesIO(captcha.screenshot_as_png))image = preprocess(image)captcha = tesserocr.image_to_text(image)captcha = re.sub('[^A-Za-z0-9]', '', captcha)browser.find_element(By.CSS_SELECTOR, '.captcha input[type="text"]').send_keys(captcha)browser.find_element(By.CSS_SELECTOR, '.login').click()try:WebDriverWait(browser, 3).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(., "登录成功")]')))time.sleep(10)browser.close()return Trueexcept TimeoutException:return Falseif __name__ == '__main__':browser = webdriver.Chrome() login()运⾏展⽰。

C#实现的简单验证码识别实例

C#实现的简单验证码识别实例

C#实现的简单验证码识别实例最近做⼀个⼩玩意需要识别验证码,之前从来没有接触过识别验证码这块,这可难倒了我。

所以,在⽹上搜索如何识别验证码,许多前辈写的博⽂教会了我。

怕以后⼜忘记了,故此写篇随笔记录。

我要识别的验证码是⼀种⾮常简单,如图:识别步骤:1、图⽚灰度化(把彩⾊的验证码图⽚转换成灰⾊的图⽚)、图⽚⼆值化复制代码代码如下:for (int i = 0; i < bmp.Width; i++){for (int j = 0; j < bmp.Height; j++) //双重循环,遍历验证码图⽚的像素点{Color color = bmp.GetPixel(i, j); //取位图某点颜⾊int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11); //灰度化if (gray * 0.2125 + gray * 0.7154 + gray * 0.0721 >= v) //⼆值化,v为阈值,⼤于等于阈值的设为⽩⾊,否者设为⿊⾊{bmp.SetPixel(i, j, Color.FromArgb(255, 255, 255));}else{bmp.SetPixel(i, j, Color.FromArgb(0, 0, 0));}}}经过图⽚灰度化的处理,图⽚就成这样⼦:经过图⽚⼆值化的处理,图⽚就成这样⼦:2、图⽚分割(把四个数字分割出来,保存像素点代码)把原来的整个验证码图⽚按照固定的宽、⾼分割出来(我是按左边距6像素,顶边距4像素,间隔4像素,宽9像素,⾼12像素分割)。

然后取出各个数字图⽚的像素⾊,255输出1,其他输出0。

就得到108(9*12)个0,1了。

复制代码代码如下: 111111111111111000000111100000000001001111111100011111111110001111111100100000000001111000000111111111111111保存完所有数字(0-9)的0,1代码之后,以后就直接与这9串0,1模糊匹配(有杂⾊的可能,所以要模糊匹配),然后就实现了⾃动识别验证码。

图片验证码原理

图片验证码原理

图片验证码原理
图片验证码是一种验证用户真实性的技术,通过显示一张随机生成的图片并要求用户输入图片中的文字或者对图片进行特定操作来判断用户是否是合法用户。

该技术的原理如下:首先,服务器随机生成一张包含字符串的图片。

这个字符串可以是数字、字母或者是它们的组合。

然后,服务器将这张图片发送给用户,并将对应的字符串保存在后台。

接下来,用户需要在一个文本框中输入图片中的字符串,或者对图片中的内容进行特定操作(比如选择所有包含某种物体的图片)。

用户完成后,服务器将用户输入的字符串与后台保存的字符串进行比对。

如果匹配成功,服务器则确认用户是合法用户;如果匹配失败,服务器则判断用户为非法用户。

通过使用图片验证码,可以有效防止机器人或者恶意软件的攻击、暴力破解等非法行为。

由于图片验证码中的字符串是随机生成的,并且需要人类的观察和理解才能识别,相对于传统的文字验证码更具安全性和可靠性。

需要注意的是,为了提高用户体验和避免用户的反感,图片验证码的难度不宜过大,同时应该提供一个可刷新的选项,以便用户在识别困难时可以重新获取另一张验证码。

识别滑块验证码的通用方法

识别滑块验证码的通用方法

识别滑块验证码的通用方法
滑块验证码是一种常见的网络验证机制,用于区分真实用户和机器人。

识别滑
块验证码的通用方法可以通过以下步骤实现:
1. 观察验证码结构:首先,要仔细观察滑块验证码的形式和结构。

通常,验证
码由一个滑块和一个背景图像组成。

滑块上可能会有文字、图标或其他模糊的图像。

2. 分析滑动轨迹:观察滑块验证码时,注意滑动轨迹的特征。

滑动轨迹显示了
用户滑动滑块的路径。

这些路径通常是曲线或折线。

3. 提取特征:使用图像处理技术,提取滑块验证码中的特征。

通常,可以根据
滑块的颜色、形状和位置等特征进行图像处理和分析。

4. 应用机器学习算法:利用识别滑块验证码的机器学习算法,训练一个模型来
自动分析和识别滑块验证码。

这种方法通常需要大量的标记数据集进行训练,并使用特征向量表示图像。

5. 测试模型准确性:在训练模型之后,使用一组未见过的滑块验证码测试模型
的准确性。

评估模型的性能,确保它能够有效地识别滑块验证码。

需要注意的是,识别滑块验证码的通用方法可能会因不同的验证码实现而有所
不同。

一些验证码可能会采用更复杂的图像处理技术,如倒置、扭曲或遮挡等。

在处理这些验证码时,可能需要采用更高级的算法和技术。

总结起来,识别滑块验证码的通用方法包括观察验证码结构、分析滑动轨迹、
提取特征、应用机器学习算法和测试模型准确性。

这些步骤可以帮助我们有效地识别和解决滑块验证码。

验证码识别(最简单之印刷体数字)

验证码识别(最简单之印刷体数字)

验证码识别(最简单之印刷体数字)# -*- coding: utf-8 -*-import numpyfrom PIL import Imageimage = Image.open("5.gif")heigh = image.size[0]weigh = image.size[1]checkbox = ([-1,0],[0,1],[1,0],[0,-1])#降噪除去⼀个点def clearpoint(im):for i in range(heigh):for j in range(weigh):if im.getpixel((i,j))==0:result = 0for count in range(4):if im.getpixel((i+checkbox[count][0],j+checkbox[count][1])):result+=1if result == 4:im.putpixel((i,j),255)return imbox = numpy.array([0,0,13,20])imagenumsit = [] #chun cun 5 ge shuziimagenumbit = []imagedoublevalue = image.convert("1")imagedoublevalue = clearpoint(imagedoublevalue)resultnum = 0for i in range(5):imagenum = imagedoublevalue.crop(box)imagenumsit.append(imagenum)box[0]=box[2]box[2]+=9for i in range(5):w = imagenumsit[i].size[0]h = imagenumsit[i].size[1]vector = [0]*wimagenumbitsingle = numpy.tile(vector,(h,1))for x in range(h):for y in range(w):if imagenumsit[i].getpixel((y,x)) == 0:imagenumbitsingle[x][y]=1imagenumbit.append(imagenumbitsingle)imagenumsit[1].show()print imagenumbit[1]代码⽤来分隔图像并且把图像⼆值化,分别保存。

简单图形验证码的识别

简单图形验证码的识别

简单图形验证码的识别作者:未知文章来源:转载点击数:161 更新时间:2007-3-3对于简单的图形验证码(字体规则,没有杂点或杂点容易过滤掉),用模板匹配的方式可以比较容易地识别出来. 0.图片黑白化,用1表示有字的像素,0表示无字的像素 1.字块分隔,将图片分隔成只包含成单字的最小块 2.生成模板,将字块与字符关联 3.识别,将新图片分块并与模板匹配java(jdk1.5)实现://先运行TemplateCreator创建模板,再运行Recognize2识别//图片数据表示,也用来表示字块package pay365;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;public class ImageData {public int[][] data;public int w;public int h;public char code;public ImageData() {}public ImageData(BufferedImage bi) {this(bi,new WhiteFilter());}public ImageData(BufferedImage bi,Filter filter) {h = bi.getHeight();w = bi.getWidth();data = new int[h][w];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {int p = bi.getRGB(j, i);data[i][j] = p;}}filter.doFilter(data);}public ImageData[] split() {ArrayList list = new ArrayList();ImageIterator ite = new ImageIterator(this);while (ite.hasNext()) {list.add(ite.next());}return (ImageData[]) list.toArray(new ImageData[0]);}int skipEmpty(int begin, boolean isX, int value) {if (isX) {for (int i = begin; i < w; i++) {for (int j = 0; j < h; j++) {if (data[j][i] != value) {return i;}}}return -1;} else {for (int i = begin; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] != value) {return i;}}}return -1;}}int skipEntity(int begin, boolean isX, int value) {if (isX) {for (int i = begin; i < w; i++) {for (int j = 0; j < h; j++) {if (data[j][i] == value) {break;}if (j == h - 1)return i;}}return -1;} else {for (int i = begin; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == value) {break;}if (j == w - 1)return i;}}return -1;}}class ImageIterator implements Iterator {int x;ImageData ia;ImageData next;public ImageIterator(ImageData ia) {this.ia = ia;}public boolean hasNext() {if (next != null)return true;next = getNext();return next != null;}ImageData getNext() {int x1 = skipEmpty(x, true, 0);if (x1 == -1) {return null;}int x2 = skipEntity(x1, true, 1);if (x2 == -1) {x2 = w;}x = x2;int y1 = skipEmpty(0, false, 0);if (y1 == -1)return null;int y2 = skipEntity(y1, false, 1);if (y2 == -1)y2 = h;return ia.clone(x1, y1, x2 - x1, y2 - y1);}public Object next() {ImageData temp = next;next = null;return temp;}public void remove() {}}ImageData clone(int x, int y, int w0, int h0) { ImageData ia = new ImageData();ia.w = w0;ia.h = h0;ia.data = new int[ia.h][ia.w];for (int i = 0; i < h0; i++) {for (int j = 0; j < w0; j++) {ia.data[i][j] = data[i + y][j + x];}}return ia;}public void show() {System.out.println();for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {System.out.print((data[i][j] == 1 ? "1" : " ") + "");}System.out.println();}System.out.println();}public int hashCode() {int code = w ^ h;int count = 0;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == 1)count++;}}code ^= count;return code;}public boolean equals(Object obj) {if (this == obj) {return true;}if (obj instanceof ImageData) {ImageData o = (ImageData) obj;if (o.h != h)return false;if (o.w != w)return false;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (o.data[i][j] != data[i][j])return false;}}return true;} else {return false;}}public static ImageData[] decodeFromFile(String path) throwsIOException {BufferedReader reader = new BufferedReader(new FileReader(new File(path)));String line;ArrayList list = new ArrayList();while ((line = reader.readLine()) != null) {ImageData ia = decode(line);if (ia != null) {list.add(ia);}}return (ImageData[]) list.toArray(new ImageData[0]);}public static ImageData decode(String s) {String[] ss = s.split("\\,", 4);if (ss.length != 4)return null;if (ss[0].length() != 1)return null;ImageData ia = new ImageData();ia.code = ss[0].charAt(0);ia.w = Integer.parseInt(ss[1]);ia.h = Integer.parseInt(ss[2]);if (ss[3].length() != ia.w * ia.h) {return null;}ia.data = new int[ia.h][ia.w];for (int i = 0; i < ia.h; i++) {for (int j = 0; j < ia.w; j++) {if (ss[3].charAt(i * ia.w + j) =='1') {ia.data[i][j] = 1;} else {ia.data[i][j] = 0;}}}return ia;}public String encode() {StringBuffer sb = new StringBuffer();sb.append(code).append(",");sb.append(w).append(",");sb.append(h).append(",");for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == 1) {sb.append('1');} else {sb.append('0');}}}return sb.toString();}}//像素过滤接口package pay365;public interface Filter {void doFilter(int[][] data);}//package pay365;public abstract class AbstractFilter implements Filter {public void doFilter(int[][] data) {int h = data.length;if (h<=0)return;int w = data[0].length;if (w<=0)return ;for(int i=0;i< h;i++) {for(int j=0;j< w;j++) {data[i][j] = filter(data[i][j]);}}}protected abstract int filter(int p);}//过滤csdn验证码的过滤器package pay365;public class CsdnFilter extends AbstractFilter {protected int filter(int p) {return isNotWhite(p)?1:0;}private boolean isNotWhite(int p) {boolean b = (p & 0×0ff) == 255 && (p >> 8 & 0×0ff) == 255&& (p >> 16 & 0xff) == 255;return !b;}}//过滤前景色为白色的过滤器package pay365;public class WhiteFilter extends AbstractFilter {protected int filter(int p) {if (isWhite(p)) {return 1;}else {return 0;}}private boolean isWhite(int p) {return (p & 0x0ff) > 240 && (p >> 8 & 0x0ff) > 240&& (p >> 16 & 0xff) > 240;}}//模板创建类package pay365;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;import java.io.PrintWriter;import .URL;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import javax.imageio.ImageIO;public class TemplateCreator {/*** @param args*/public static void main(String[] args) throws Exception {Set set = new HashSet();String url = "/member/ShowExPwd.aspx";String filterClazz = "pay365.CsdnFilter";if (args.length>=1) {url = args[0];}if (args.length>=2) {filterClazz = args[1];}Filter csdnFilter = (Filter) Class.forName(filterClazz).newInstance();for (int i = 1; i < 10; i++) {URL u = new URL(url);BufferedImage bi = ImageIO.read(u);ImageData ia2 = new ImageData(bi,csdnFilter);ImageData[] ii = ia2.split();for (int x = 0; x < ii.length; x++) {ImageData imageArr = ii[x];set.add(imageArr);}// set.addAll(Arrays.asList(ia2.split()));}System.out.println(set.size());for (Iterator iter = set.iterator(); iter.hasNext();) {ImageData ele = (ImageData) iter.next();ele.show();System.out.print("char:");String s = readLine();if (s.length() == 1) {ele.code = s.charAt(0);}}PrintWriter pw = new PrintWriter(new File("template.data"));for (Iterator iter = set.iterator(); iter.hasNext();) {ImageData ele = (ImageData) iter.next();pw.println(ele.encode());}pw.flush();pw.close();}private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));private static String readLine() {try {return reader.readLine();} catch (Exception e) {e.printStackTrace();return "";}}}//识别类package pay365;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import .URL;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import javax.imageio.ImageIO;public class Recognize2 {static String url = "/member/ShowExPwd.aspx";static Filter filter;public static void main(String[] args) throws Exception {if (args.length >= 1) {url = args[0];}String filterClazz = "pay365.CsdnFilter";if (args.length >= 2) {filterClazz = args[1];}filter = (Filter) Class.forName(filterClazz).newInst ance();int total = 10;int count = 0;for (int i = 0; i < total; i++) {boolean b = recognize(i);if (b)count++;}System.out.println("rate:" + (count * 1.0 / total * 100) + "%100");}/*** @throws IOException*/private static boolean recognize(int num) throws IOException { BufferedImage bi = ImageIO.read(new URL(url));ImageIO.write(bi,"png",new File(num+".png"));ImageData ia2 = new ImageData(bi, filter);ImageData[] ii = ia2.split();ArrayList list = new ArrayList();ImageData[] template = ImageData.decodeFromFile("template.data");HashMap map = new HashMap();for (int i = 0; i < template.length; i++) {map.put(template[i], new Character(template[i].code));}for (int x = 0; x < ii.length; x++) {ImageData imageArr = ii[x];if (imageArr.w > 15)continue;Character c = (Character) map.get(imageArr);if (c != null) {list.add(c);}}String s = "";System.out.print(num + ":");for (Iterator iter = list.iterator(); iter.hasNext();) {Character c = (Character) iter.next();s += c;System.out.print(c);}System.out.println();return s.length() != 0;}}。

基于Python的简单验证码识别

基于Python的简单验证码识别

基于Python的简单验证码识别摘要:验证码在⽹络安全⽅⾯发挥着关键作⽤,验证码的主要⽬的是区分⼈类和计算机,⽤来防⽌⾃动化脚本对⽹站的⼀些恶意⾏为。

⽬前绝⼤多数⽹站都利⽤验证码来阻⽌恶意脚本程序的⼊侵。

验证码经过图像的预处理字符分割,匹配识别等步骤来完成对字符验证的处理,后进过特征提取与匹配等操作完成对⼀个验证码的识别。

本⽂选取了⼀个⽹站进⾏⽹站登录的验证码识别,识别结果取得了预期的效果,较好的识别出了验证码。

关键字:验证码;图像识别;Python;预处理Abstrat:CAPTCHA plays a key role in network security, The main purpose of the CAPTCHA is to differentiate between humans and computers, to prevent some malicious behavior from automating scripts on the site. At present, most websites use Authenticode to prevent the intrusion of malicious script programs. The verification code passes the preprocessing character segmentation of the image, the matching recognition and so on completes the processing to the character verification, the backward feature extraction and the matching operation completes to the verification code recognition. In this paper, a website is selected to identify the verification code, the result obtained the expected results, a better identification of the verification code.Key words:CAPTCHA; Image recognition; Python; Pretreatment;0.引⾔验证码是⽬前互联⽹上⼀种⾮常重要⾮常常见的安全识别技术,先引⽤⼀段来⾃wiki的关于验证码的描述:“全⾃动区分计算机和⼈类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)[1],俗称验证码,是⼀种区分⽤户是计算机和⼈的公共⾃动程序。

验证码识别步骤---完美ESALES系统验证码识别过程(含图片)

验证码识别步骤---完美ESALES系统验证码识别过程(含图片)

验证码识别步骤---完美ESALES系统验证码识别过程(含图
片)
验证码识别步骤---完美ESALES系统验证码识别过程
(含图片)
由于本人最近工作较忙,因此零散的给出一些常用验证码的
识别算法,写的不是很详细,需要的请QQ跟我联系详谈
完美ESALES系统的验证码步骤
1、灰度滤色(将图片的色彩转化为黑白图片,即灰度化,
然后根据灰度值分辨出有效的颜色和无效的颜色,譬如说我
们这里采用的是:L(0-148),即表示是将灰度值为0-148的规整出来作为有效值1,其他的都为无效值0)
2、连点去噪(将图片根据字符下限和字符上限的值进行分
割,譬如说这里就表示需要分割为4个字符,由于完美的验证码图片经过灰度滤色以后,就直接的消除了背景色和噪点,所以我们这里不需要再进行其他的处理,直接的进行连点去噪就可以)
3、图像分割(将图像根据01分割为4个小图片)
4、统一大小(为了方便辨认,我们这里将图像统一的变为
40 X 40的模拟图像)
5、检查(这里先从库中读取每个字符跟获取的字符信息的相似值,然后从中选取小于500的跟这个字符最相近的字符作为这个验证码识别出来的字符)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单图形验证码的识别作者:未知文章来源:转载点击数:161 更新时间:2007-3-3对于简单的图形验证码(字体规则,没有杂点或杂点容易过滤掉),用模板匹配的方式可以比较容易地识别出来. 0.图片黑白化,用1表示有字的像素,0表示无字的像素 1.字块分隔,将图片分隔成只包含成单字的最小块 2.生成模板,将字块与字符关联 3.识别,将新图片分块并与模板匹配java(jdk1.5)实现://先运行TemplateCreator创建模板,再运行Recognize2识别//图片数据表示,也用来表示字块package pay365;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;public class ImageData {public int[][] data;public int w;public int h;public char code;public ImageData() {}public ImageData(BufferedImage bi) {this(bi,new WhiteFilter());}public ImageData(BufferedImage bi,Filter filter) {h = bi.getHeight();w = bi.getWidth();data = new int[h][w];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {int p = bi.getRGB(j, i);data[i][j] = p;}}filter.doFilter(data);}public ImageData[] split() {ArrayList list = new ArrayList();ImageIterator ite = new ImageIterator(this);while (ite.hasNext()) {list.add(ite.next());}return (ImageData[]) list.toArray(new ImageData[0]);}int skipEmpty(int begin, boolean isX, int value) {if (isX) {for (int i = begin; i < w; i++) {for (int j = 0; j < h; j++) {if (data[j][i] != value) {return i;}}}return -1;} else {for (int i = begin; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] != value) {return i;}}}return -1;}}int skipEntity(int begin, boolean isX, int value) {if (isX) {for (int i = begin; i < w; i++) {for (int j = 0; j < h; j++) {if (data[j][i] == value) {break;}if (j == h - 1)return i;}}return -1;} else {for (int i = begin; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == value) {break;}if (j == w - 1)return i;}}return -1;}}class ImageIterator implements Iterator {int x;ImageData ia;ImageData next;public ImageIterator(ImageData ia) {this.ia = ia;}public boolean hasNext() {if (next != null)return true;next = getNext();return next != null;}ImageData getNext() {int x1 = skipEmpty(x, true, 0);if (x1 == -1) {return null;}int x2 = skipEntity(x1, true, 1);if (x2 == -1) {x2 = w;}x = x2;int y1 = skipEmpty(0, false, 0);if (y1 == -1)return null;int y2 = skipEntity(y1, false, 1);if (y2 == -1)y2 = h;return ia.clone(x1, y1, x2 - x1, y2 - y1);}public Object next() {ImageData temp = next;next = null;return temp;}public void remove() {}}ImageData clone(int x, int y, int w0, int h0) { ImageData ia = new ImageData();ia.w = w0;ia.h = h0;ia.data = new int[ia.h][ia.w];for (int i = 0; i < h0; i++) {for (int j = 0; j < w0; j++) {ia.data[i][j] = data[i + y][j + x];}}return ia;}public void show() {System.out.println();for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {System.out.print((data[i][j] == 1 ? "1" : " ") + "");}System.out.println();}System.out.println();}public int hashCode() {int code = w ^ h;int count = 0;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == 1)count++;}}code ^= count;return code;}public boolean equals(Object obj) {if (this == obj) {return true;}if (obj instanceof ImageData) {ImageData o = (ImageData) obj;if (o.h != h)return false;if (o.w != w)return false;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (o.data[i][j] != data[i][j])return false;}}return true;} else {return false;}}public static ImageData[] decodeFromFile(String path) throwsIOException {BufferedReader reader = new BufferedReader(new FileReader(new File(path)));String line;ArrayList list = new ArrayList();while ((line = reader.readLine()) != null) {ImageData ia = decode(line);if (ia != null) {list.add(ia);}}return (ImageData[]) list.toArray(new ImageData[0]);}public static ImageData decode(String s) {String[] ss = s.split("\\,", 4);if (ss.length != 4)return null;if (ss[0].length() != 1)return null;ImageData ia = new ImageData();ia.code = ss[0].charAt(0);ia.w = Integer.parseInt(ss[1]);ia.h = Integer.parseInt(ss[2]);if (ss[3].length() != ia.w * ia.h) {return null;}ia.data = new int[ia.h][ia.w];for (int i = 0; i < ia.h; i++) {for (int j = 0; j < ia.w; j++) {if (ss[3].charAt(i * ia.w + j) =='1') {ia.data[i][j] = 1;} else {ia.data[i][j] = 0;}}}return ia;}public String encode() {StringBuffer sb = new StringBuffer();sb.append(code).append(",");sb.append(w).append(",");sb.append(h).append(",");for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (data[i][j] == 1) {sb.append('1');} else {sb.append('0');}}}return sb.toString();}}//像素过滤接口package pay365;public interface Filter {void doFilter(int[][] data);}//package pay365;public abstract class AbstractFilter implements Filter {public void doFilter(int[][] data) {int h = data.length;if (h<=0)return;int w = data[0].length;if (w<=0)return ;for(int i=0;i< h;i++) {for(int j=0;j< w;j++) {data[i][j] = filter(data[i][j]);}}}protected abstract int filter(int p);}//过滤csdn验证码的过滤器package pay365;public class CsdnFilter extends AbstractFilter {protected int filter(int p) {return isNotWhite(p)?1:0;}private boolean isNotWhite(int p) {boolean b = (p & 0×0ff) == 255 && (p >> 8 & 0×0ff) == 255&& (p >> 16 & 0xff) == 255;return !b;}}//过滤前景色为白色的过滤器package pay365;public class WhiteFilter extends AbstractFilter {protected int filter(int p) {if (isWhite(p)) {return 1;}else {return 0;}}private boolean isWhite(int p) {return (p & 0x0ff) > 240 && (p >> 8 & 0x0ff) > 240&& (p >> 16 & 0xff) > 240;}}//模板创建类package pay365;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;import java.io.PrintWriter;import .URL;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import javax.imageio.ImageIO;public class TemplateCreator {/*** @param args*/public static void main(String[] args) throws Exception {Set set = new HashSet();String url = "/member/ShowExPwd.aspx";String filterClazz = "pay365.CsdnFilter";if (args.length>=1) {url = args[0];}if (args.length>=2) {filterClazz = args[1];}Filter csdnFilter = (Filter) Class.forName(filterClazz).newInstance();for (int i = 1; i < 10; i++) {URL u = new URL(url);BufferedImage bi = ImageIO.read(u);ImageData ia2 = new ImageData(bi,csdnFilter);ImageData[] ii = ia2.split();for (int x = 0; x < ii.length; x++) {ImageData imageArr = ii[x];set.add(imageArr);}// set.addAll(Arrays.asList(ia2.split()));}System.out.println(set.size());for (Iterator iter = set.iterator(); iter.hasNext();) {ImageData ele = (ImageData) iter.next();ele.show();System.out.print("char:");String s = readLine();if (s.length() == 1) {ele.code = s.charAt(0);}}PrintWriter pw = new PrintWriter(new File("template.data"));for (Iterator iter = set.iterator(); iter.hasNext();) {ImageData ele = (ImageData) iter.next();pw.println(ele.encode());}pw.flush();pw.close();}private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));private static String readLine() {try {return reader.readLine();} catch (Exception e) {e.printStackTrace();return "";}}}//识别类package pay365;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import .URL;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import javax.imageio.ImageIO;public class Recognize2 {static String url = "/member/ShowExPwd.aspx";static Filter filter;public static void main(String[] args) throws Exception {if (args.length >= 1) {url = args[0];}String filterClazz = "pay365.CsdnFilter";if (args.length >= 2) {filterClazz = args[1];}filter = (Filter) Class.forName(filterClazz).newInst ance();int total = 10;int count = 0;for (int i = 0; i < total; i++) {boolean b = recognize(i);if (b)count++;}System.out.println("rate:" + (count * 1.0 / total * 100) + "%100");}/*** @throws IOException*/private static boolean recognize(int num) throws IOException { BufferedImage bi = ImageIO.read(new URL(url));ImageIO.write(bi,"png",new File(num+".png"));ImageData ia2 = new ImageData(bi, filter);ImageData[] ii = ia2.split();ArrayList list = new ArrayList();ImageData[] template = ImageData.decodeFromFile("template.data");HashMap map = new HashMap();for (int i = 0; i < template.length; i++) {map.put(template[i], new Character(template[i].code));}for (int x = 0; x < ii.length; x++) {ImageData imageArr = ii[x];if (imageArr.w > 15)continue;Character c = (Character) map.get(imageArr);if (c != null) {list.add(c);}}String s = "";System.out.print(num + ":");for (Iterator iter = list.iterator(); iter.hasNext();) {Character c = (Character) iter.next();s += c;System.out.print(c);}System.out.println();return s.length() != 0;}}。

相关文档
最新文档