免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15647 | 回复: 16

用perl实现 图片认证码识别 [复制链接]

论坛徽章:
0
发表于 2009-02-02 12:40 |显示全部楼层
程序说明

需要使用了两个库  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. }

复制代码

[ 本帖最后由 hitsubunnu 于 2009-2-3 17:27 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
发表于 2009-02-02 13:01 |显示全部楼层
谢谢共享

论坛徽章:
0
发表于 2009-02-02 14:10 |显示全部楼层
3qu

论坛徽章:
0
发表于 2009-08-04 16:45 |显示全部楼层
非常不错,正需要着呢,谢谢了

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
发表于 2010-11-26 13:33 |显示全部楼层
发现根本没有 GetPixel 这个函数

论坛徽章:
0
发表于 2010-11-26 13:47 |显示全部楼层
学习了!!!

论坛徽章:
0
发表于 2010-11-26 13:50 |显示全部楼层
记得以前在一个博客里看过这篇文章,在windows上没做成功~

论坛徽章:
0
发表于 2010-11-26 14:24 |显示全部楼层
谢谢分享,学习中

论坛徽章:
0
发表于 2010-11-26 14:25 |显示全部楼层
发现根本没有 GetPixel 这个函数
iakuf 发表于 2010-11-26 13:33


检查你的 Image::Magick 是否安装正确

论坛徽章:
0
发表于 2010-11-26 14:30 |显示全部楼层
回复 7# x9x9

我写的很清楚 imgseek 不支持 win
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP