PHP实现验证码的识别
来源:互联网 发布:新媒体数据分析 编辑:程序博客网 时间:2024/06/06 08:48
我们最常见的验证码
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代码复制代码test.php复制代码
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代码
- <?php
- define('WORD_WIDTH',9);
- define('WORD_HIGHT',13);
- define('OFFSET_X',7);
- define('OFFSET_Y',3);
- define('WORD_SPACING',4);
- class valite
- {
- public function setImage($Image)
- {
- $this->ImagePath = $Image;
- }
- public function getData()
- {
- return $data;
- }
- public function getResult()
- {
- return $DataArray;
- }
- public function getHec()
- {
- $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;
- }
- public function run()
- {
- $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($data as $numKey => $numString)
- {
- $max=0.0;
- $num = 0;
- foreach($this->Keys as $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;
- }
- public function Draw()
- {
- for($i=0; $i<$this->ImageSize[1]; ++$i)
- {
- for($j=0; $j<$this->ImageSize[0]; ++$j)
- {
- echo $this->DataArray[$i][$j];
- }
- echo "\n";
- }
- }
- public function __construct()
- {
- $this->Keys = array(
- '0'=>'000111000011111110011000110110000011110000011110000011110000011110000011110000011110000011011000110011111110000111000',
- '1'=>'000111000011111000011111000000011000000011000000011000000011000000011000000011000000011000000011000011111111011111111',
- '2'=>'011111000111111100100000110000000111000000110000001100000011000000110000001100000011000000110000000011111110111111110',
- '3'=>'011111000111111110100000110000000110000001100011111000011111100000001110000000111000000110100001110111111100011111000',
- '4'=>'000001100000011100000011100000111100001101100001101100011001100011001100111111111111111111000001100000001100000001100',
- '5'=>
- '111111110111111110110000000110000000110000000111110000111111100000001110000000111000000110100001110111111100011111000',
- '6'=>'000111100001111110011000010011000000110000000110111100111111110111000111110000011110000011011000111011111110000111100',
- '7'=>'011111111011111111000000011000000010000000110000001100000001000000011000000010000000110000000110000001100000001100000',
- '8'=>'001111100011111110011000110011000110011101110001111100001111100011101110110000011110000011111000111011111110001111100',
- '9'=>'001111000011111110111000111110000011110000011111000111011111111001111011000000011000000110010000110011111100001111000',
- );
- }
- protected $ImagePath;
- protected $DataArray;
- protected $ImageSize;
- protected $data;
- protected $Keys;
- protected $NumStringArray;
- }
- ?>
- <?php
- include ('Valite.php');
- $valite = new Valite();
- $valite->setImage('code.jpeg');
- $valite->getHec();
- $ert = $valite->run();
- echo $ert;
- echo '<br><img src="code.jpeg"><br>';
- ?>
- php实现验证码的识别
- PHP实现验证码的识别
- php实现验证码的破解识别
- php实现验证码的识别(初级篇)
- php实现验证码的识别(中级篇)
- php实现验证码的识别(中级篇)
- (转)php实现验证码的识别(中级篇)
- php实现验证码的识别(中级篇)(转)
- php实现验证码的识别(初级篇)
- php实现验证码的识别(中级篇)
- php实现验证码的破解识别(初级篇)
- php实现验证码的识别(初级篇)
- php实现验证码的识别(中级篇)
- php实现验证码的识别(初级篇)
- php实现验证码的识别(初级篇)
- php实现验证码的识别(中级篇)
- php实现验证码识别入门
- php实现验证码识别原理和程序代码实例
- MyEclipse Eclipse下配置各种插件的方法
- 编写通用内核shellcode
- gdb单步调试
- Delphi 编写COM+组件的知识和样例
- linux serial构架分析及驱动开发
- PHP实现验证码的识别
- 从奥运订票系统说起——谈FastCGI 与IT 架构
- PL/SQL Developer 使用技巧小结
- JAVA调用Oracle存储过程的实现方法
- 在linux下做的多用户聊天室
- 如何识别高级的验证码
- CRM introduction
- 复制粘贴
- 安装linux软件时缺.h文件时解决办法一则