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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

验证码识别一般分为以下几个步骤:
1.取出字模
2.二值化
3.计算特征
4.对照样本
1:取出字模
识别验证码,毕竟不是专业的OCR识别,并且,由于各个网站的验证码各不相同,所以,最常见的方法就是就是建立这个验证码的特征码库。

去字模时,我们需要多下载几张图片,使这些图片中,包括所有的字符,我们这里的字母只有图片,所以,只要收集到包括0-9的图片即可。

2:二值化
二值化就是把图片上的验证数字上每个象素用一种数字表示1,其他部分用0表示。

这样就可以计算出每个数字字模,记录下这些字模来,当作key即可。

3:计算特征
把要识别的图片,进行二值化,得到图片特征。

4:对照样本
把步骤3种的图片特征码和验证码的字模进行对比,得到验证图片上的数字。

使用目前这种方法,对验证码的识别基本上可以做到100%。

通过以上步骤,您可能说了,并没有发现如何取出干扰素啊!其实取出干扰素的方法很简单,干扰素的一个重要特征是,不能影响验证码的显示效果,所以制作干扰素时它的RGB可能低于或者高于某个特定值,比如我给的例子中的图片,干扰素的RGB各项值是不会超过125的,所以,这样我们就很容易去掉干扰素了。

<?php
define('WORD_WIDTH',9);
define('WORD_HIGHT',13);
define('OFFSET_X',7);
define('OFFSET_Y',3);
define('WORD_SPACING',4);
classvalite
{
publicfunctionsetImage($Image)
{
$this->ImagePath=$Image;
}
publicfunctiongetData()
{
return$data;
}
publicfunctiongetResult()
{
return$DataArray;
}
publicfunctiongetHec()
{
$res=imagecreatefromjpeg($this->ImagePath);
$size=getimagesize($this->ImagePath);
$data=array();
for($i=0;$i<$size[1];++$i)
{
for($j=0;$j<$size[0];++$j)
{
$rgb=imagecolorat($res,$j,$i);
$rgbarray=imagecolorsforindex($res,$rgb);
if($rgbarray['red']<125||$rgbarray['green']<125
||$rgbarray['blue']<125)
{
$data[$i][$j]=1;
}else{
$data[$i][$j]=0;
}
}
}
$this->DataArray=$data;
$this->ImageSize=$size;
}
publicfunctionrun()
{
$result="";
//查找4个数字
$data=array("","","","");
for($i=0;$i<4;++$i)
{
$x=($i*(WORD_WIDTH+WORD_SPACING))+OFFSET_X; $y=OFFSET_Y;
for($h=$y;$h<(OFFSET_Y+WORD_HIGHT);++$h) {
for($w=$x;$w<($x+WORD_WIDTH);++$w)
{
$data[$i].=$this->DataArray[$h][$w];
}
}
}
//进行关键字匹配
foreach($dataas$numKey=>$numString)
{
$max=0.0;
$num=0;
foreach($this->Keysas$key=>$value)
{
$percent=0.0;
similar_text($value,$numString,$percent); if(intval($percent)>$max)
{
$max=$percent;
$num=$key;
if(intval($percent)>95)
break;
}
}
$result.=$num;
}
$this->data=$result;
//查找最佳匹配数字
return$result;
}
publicfunctionDraw()
{
for($i=0;$i<$this->ImageSize[1];++$i)
{
for($j=0;$j<$this->ImageSize[0];++$j)
{
echo$this->DataArray[$i][$j];
}
echo"\n";
}
}
publicfunction__construct()
{
$this->Keys=array(
'0'=>'00011100001111111001100011011000001111000001111000001111000 0011110000011110000011110000011011000110011111110000111000', '1'=>'00011100001111100001111100000001100000001100000001100000001 1000000011000000011000000011000000011000011111111011111111', '2'=>'01111100011111110010000011000000011100000011000000110000001 1000000110000001100000011000000110000000011111110111111110', '3'=>'01111100011111111010000011000000011000000110001111100001111 1100000001110000000111000000110100001110111111100011111000', '4'=>'00000110000001110000001110000011110000110110000110110001100 1100011001100111111111111111111000001100000001100000001100', '5'=>
'1111111101111111101100000001100000001100000001111100001111111000 00001110000000111000000110100001110111111100011111000', '6'=>'00011110000111111001100001001100000011000000011011110011111 1110111000111110000011110000011011000111011111110000111100', '7'=>'01111111101111111100000001100000001000000011000000110000000 1000000011000000010000000110000000110000001100000001100000', '8'=>'00111110001111111001100011001100011001110111000111110000111 1100011101110110000011110000011111000111011111110001111100', '9'=>'00111100001111111011100011111000001111000001111100011101111 1111001111011000000011000000110010000110011111100001111000', );
}
protected$ImagePath;
protected$DataArray; protected$ImageSize; protected$data;
protected$Keys;
protected$NumStringArray; }
?>。

相关文档
最新文档