Perl 图片验证码 识别分析

前端之家收集整理的这篇文章主要介绍了Perl 图片验证码 识别分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转自http://bbs.chinaunix.net/thread-1360950-1-1.html

感觉不错,学习学习。。

需要使用了两个库  1. Image::Magick 用来进行图片处理  2. imgseek 进行图片比较 求出相似度


程序因为使用到 imgseek 所以只能在*nix下运行

程序设计时 分两个部分 1.建里特征图片库  2. 用随即图片与特征图片库进行比较 求出相似度最高的值 
这个程序仅仅是为了供大家研究参考    # 为了不惹麻烦 把测试网站删除了  
一. 建立特征图片库 
1. 下载 包含 0到9 共10个数字的图片
  
    我这里是 手工下载了10张第一个数字不同的图片 
2. 对图片进行处理 
    转换成灰度图 -> 2值化(我这里设定的阙值是20300)-> 把第一个数字切割下来
  1.    
  2. use Image::Magick;
  3. my $image = new Image::Magick;

  4. for my $num qw(00 01 02 03 04 05 06 07 08 09){
  5.         my $file = './image/'.$num.'.bmp';
  6.         $image->Read($file);
  7. }
  8. $image->Quantize(colorspace=>'gray');                  #灰度图
  9. $image->Threshold(threshold=>'20300',channel=>'All');  # 2值化  阙值需要自己手工调整
  10. $image->Crop(width=>18,height=>25,x=>0,y=>0);       #切割图片
  11. my $out = './image/I.bmp';
  12. $image->Write($out);
  13. $image = undef;
  14. exit;

  3. 提取出仅含有数字的区域 (即去掉四周的空白)
  1.   
  2. use List::Util qw(max min);
  3. for my $num (0..9){
  4. my $file = './image/I-'.$num.'.bmp';
  5. $image->Read($file);
  6. my ($w,$h)=$image -> Get('width','height');
  7. my (@px_x,@px_y);
  8. for my $x(0..$w){
  9.         for my $y (0..$h){
  10.                 my $px = $image -> GetPixel(x=>$x,y=>$y);
  11.                 if($px == 0){
  12.                         push @px_x,$x;
  13.                         push @px_y,$y;
  14.                 }
  15.         }
  16. my ($xmax,$xmin,$ymax,$ymin) = (max(@px_x),min(@px_x),max(@px_y),min(@px_y));
  17. my $xw = $xmax-$xmin + 2;
  18. my $yh = $ymax-$ymin + 2;
  19. $xmin -= 1;
  20. $ymin -= 1;
  21. $image->Crop(width=>$xw,height=>$yh,x=>$xmin,y=>$ymin);
  22. #$image->Magnify;
  23. my $out = './flag/II-'.$num.'.bmp';
  24. exit;
复制代码
   
  4.存入到 图片库里
  1. use Imager;
  2. use Image::Seek qw(loaddb add_image query_id savedb);
  3. loaddb("imgdata.db");
  4.         my $img = Imager->new();
  5.         my $file = './flag/II-'.$num.'.bmp'; 
  6.         $img->open(file => $file);
  7.         add_image($img,$num);
  8.         savedb("imgdata.db");
  9.         
  10.         $img = undef;
  11. }

二 随即认证码 图片识别
  1.随机图片下载加工
  1. use LWP::Simple;
  2. my $url = '****';  # 为了不惹麻烦 把测试网站删除
  3. my $file = './cut/tmp.bmp';
  4. getstore($url,$file);
  5. for my $num (0..3){
  6.         my $image = new Image::Magick;
  7.         my ($w,$h,) = $image->Get('width',serif; font-size:12px; line-height:1.8em">         $w /= 4;
  8.         my $xxx = $w * $num;
  9.         $image->Quantize(colorspace=>'gray');
  10.         $image->Threshold(threshold=>'20300',channel=>'All');
  11.         $image->Crop(width=>$w,height=>$h,x=>$xxx,y=>0);
  12.         $image->Write('./cut/t.bmp');
  13.         $image = undef;
  14.         my $img = new Image::Magick;
  15.         $img->Read('./cut/t.bmp');
  16.         my (@px_x,serif; font-size:12px; line-height:1.8em">         for my $x(0..$w){
  17.                 for my $y (0..$h){
  18.                         my $px = $img -> GetPixel(x=>$x,serif; font-size:12px; line-height:1.8em">                         if($px == 0){
  19.                                 push @px_x,serif; font-size:12px; line-height:1.8em">                                 push @px_y,serif; font-size:12px; line-height:1.8em">                         }
  20.         my ($xmax,serif; font-size:12px; line-height:1.8em">         my $xw = $xmax-$xmin + 2;
  21.         my $yh = $ymax-$ymin + 2;
  22.         $xmin -= 1;
  23.         $ymin -= 1;
  24.         $img->Crop(width=>$xw,serif; font-size:12px; line-height:1.8em">         my $out = './cut/'.$num.'.bmp';
  25.         $img->Write($out);
  26.    2. 识别
    1.     
    2. use Image::Seek qw(loaddb add_image query_id savedb remove_id);
    3. my $img = Imager->new();
    4. my $file = './cut/'.$num.'.bmp'; 
    5. $img->open(file => $file);
    6. add_image($img,10);
    7. savedb("imgdata.db");
    8. my @results = query_id(10); # What looks like this photo?
    9. remove_id(10); # Just remove id from database.

    10.         print $results[1]->[0];
    11. }

猜你在找的Perl相关文章