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. use Image::Magick;

  4. for my $num (0..9){

  5. my $image = new Image::Magick;
  6. my $file = './image/I-'.$num.'.bmp';
  7. $image->Read($file);

  8. my ($w,$h)=$image -> Get('width','height');

  9. my (@px_x,@px_y);
  10. for my $x(0..$w){
  11.         for my $y (0..$h){
  12.                 my $px = $image -> GetPixel(x=>$x,y=>$y);
  13.                 if($px == 0){
  14.                         push @px_x,$x;
  15.                         push @px_y,$y;
  16.                 }
  17.         }
  18. }

  19. my ($xmax,$xmin,$ymax,$ymin) = (max(@px_x),min(@px_x),max(@px_y),min(@px_y));
  20. my $xw = $xmax-$xmin + 2;
  21. my $yh = $ymax-$ymin + 2;
  22. $xmin -= 1;
  23. $ymin -= 1;

  24. $image->Crop(width=>$xw, height=>$yh, x=>$xmin, y=>$ymin);

  25. #$image->Magnify;
  26. my $out = './flag/II-'.$num.'.bmp';
  27. $image->Write($out);

  28. $image = undef;

  29. }

  30. exit;
复制代码
   
  4.存入到 图片库里

  1. use Imager;

  2. use Image::Seek qw(loaddb add_image query_id savedb);

  3. loaddb("imgdata.db");

  4. for my $num (0..9){
  5.         my $img = Imager->new();
  6.         my $file = './flag/II-'.$num.'.bmp'; 

  7.         $img->open(file => $file);

  8.         add_image($img,$num);
  9.         savedb("imgdata.db");
  10.         
  11.         $img = undef;
  12. }


二 随即认证码 图片识别

  1.随机图片下载加工
  1.    
  2. use List::Util qw(max min);

  3. use Image::Magick;
  4. use LWP::Simple;

  5. my $url = '****';  # 为了不惹麻烦 把测试网站删除了
  6. my $file = './cut/tmp.bmp';
  7. getstore($url, $file);

  8. for my $num (0..3){
  9.         my $image = new Image::Magick;
  10.         $image->Read($file);
  11.         my ($w, $h,) = $image->Get('width', 'height');
  12.         $w /= 4;
  13.         my $xxx = $w * $num;
  14.         
  15.         $image->Quantize(colorspace=>'gray');
  16.         $image->Threshold(threshold=>'20300',channel=>'All');
  17.         $image->Crop(width=>$w, height=>$h, x=>$xxx, y=>0);
  18.         
  19.         $image->Write('./cut/t.bmp');
  20.         $image = undef;
  21.         
  22.         my $img = new Image::Magick;
  23.         $img->Read('./cut/t.bmp');
  24.         my (@px_x,@px_y);
  25.         for my $x(0..$w){
  26.                 for my $y (0..$h){
  27.                         my $px = $img -> GetPixel(x=>$x,y=>$y);
  28.                         if($px == 0){
  29.                                 push @px_x,$x;
  30.                                 push @px_y,$y;
  31.                         }
  32.                 }
  33.         }

  34.         my ($xmax,$xmin,$ymax,$ymin) = (max(@px_x),min(@px_x),max(@px_y),min(@px_y));
  35.         my $xw = $xmax-$xmin + 2;
  36.         my $yh = $ymax-$ymin + 2;
  37.         $xmin -= 1;
  38.         $ymin -= 1;

  39.         $img->Crop(width=>$xw, height=>$yh, x=>$xmin, y=>$ymin);
  40.         
  41.         
  42.         my $out = './cut/'.$num.'.bmp';
  43.         $img->Write($out);

  44.         $img = undef;
  45. }

   2. 识别
  1.     
  2. use Imager;

  3. use Image::Seek qw(loaddb add_image query_id savedb remove_id);

  4. loaddb("imgdata.db");

  5. for my $num (0..3){
  6. my $img = Imager->new();
  7. my $file = './cut/'.$num.'.bmp'; 

  8. $img->open(file => $file);

  9. add_image($img,10);
  10. savedb("imgdata.db");

  11. my @results = query_id(10); # What looks like this photo?
  12. remove_id(10); # Just remove id from database.

  13.         print $results[1]->[0];
  14. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值