转自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)-> 把第一个数字切割下来
- ? ?
- use Image::Magick;
- my $image = new Image::Magick;
-
- for my $num qw(00 01 02 03 04 05 06 07 08 09){
- ? ? ? ? my $file = './image/'.$num.'.bmp';
- ? ? ? ? $image->Read($file);
- }
- $image->Quantize(colorspace=>'gray');? ?? ?? ?? ?? ?? ?#灰度图
- $image->Threshold(threshold=>'20300',channel=>'All');??# 2值化??阙值需要自己手工调整
- $image->Crop(width=>18,height=>25,x=>0,y=>0);? ?? ? #切割图片
- my $out = './image/I.bmp';
- $image->Write($out);
- $image = undef;
- exit;
??3. 提取出仅含有数字的区域 (即去掉四周的空白)
- ??
- use List::Util qw(max min);
- for my $num (0..9){
- my $file = './image/I-'.$num.'.bmp';
- $image->Read($file);
- my ($w,$h)=$image -> Get('width','height');
- my (@px_x,@px_y);
- for my $x(0..$w){
- ? ? ? ? for my $y (0..$h){
- ? ? ? ? ? ? ? ? my $px = $image -> GetPixel(x=>$x,y=>$y);
- ? ? ? ? ? ? ? ? if($px == 0){
- ? ? ? ? ? ? ? ? ? ? ? ? push @px_x,$x;
- ? ? ? ? ? ? ? ? ? ? ? ? push @px_y,$y;
- ? ? ? ? ? ? ? ? }
- ? ? ? ? }
- my ($xmax,$xmin,$ymax,$ymin) = (max(@px_x),min(@px_x),max(@px_y),min(@px_y));
- my $xw = $xmax-$xmin + 2;
- my $yh = $ymax-$ymin + 2;
- $xmin -= 1;
- $ymin -= 1;
- $image->Crop(width=>$xw,height=>$yh,x=>$xmin,y=>$ymin);
- #$image->Magnify;
- my $out = './flag/II-'.$num.'.bmp';
- exit;
复制代码
? ?
??4.存入到 图片库里
- use Imager;
- use Image::Seek qw(loaddb add_image query_id savedb);
- loaddb("imgdata.db");
- ? ? ? ? my $img = Imager->new();
- ? ? ? ? my $file = './flag/II-'.$num.'.bmp';?
- ? ? ? ? $img->open(file => $file);
- ? ? ? ? add_image($img,$num);
- ? ? ? ? savedb("imgdata.db");
- ? ? ? ??
- ? ? ? ? $img = undef;
- }
二 随即认证码 图片识别
??1.随机图片下载加工
- use LWP::Simple;
- my $url = '****';??# 为了不惹麻烦 把测试网站删除了
- my $file = './cut/tmp.bmp';
- getstore($url,$file);
- for my $num (0..3){
- ? ? ? ? my $image = new Image::Magick;
- ? ? ? ? my ($w,$h,) = $image->Get('width',serif; font-size:12px; line-height:1.8em"> ? ? ? ? $w /= 4;
- ? ? ? ? my $xxx = $w * $num;
- ? ? ? ? $image->Quantize(colorspace=>'gray');
- ? ? ? ? $image->Threshold(threshold=>'20300',channel=>'All');
- ? ? ? ? $image->Crop(width=>$w,height=>$h,x=>$xxx,y=>0);
- ? ? ? ? $image->Write('./cut/t.bmp');
- ? ? ? ? $image = undef;
- ? ? ? ? my $img = new Image::Magick;
- ? ? ? ? $img->Read('./cut/t.bmp');
- ? ? ? ? my (@px_x,serif; font-size:12px; line-height:1.8em"> ? ? ? ? for my $x(0..$w){
- ? ? ? ? ? ? ? ? for my $y (0..$h){
- ? ? ? ? ? ? ? ? ? ? ? ? my $px = $img -> GetPixel(x=>$x,serif; font-size:12px; line-height:1.8em"> ? ? ? ? ? ? ? ? ? ? ? ? if($px == 0){
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? push @px_x,serif; font-size:12px; line-height:1.8em"> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? push @px_y,serif; font-size:12px; line-height:1.8em"> ? ? ? ? ? ? ? ? ? ? ? ? }
- ? ? ? ? my ($xmax,serif; font-size:12px; line-height:1.8em"> ? ? ? ? my $xw = $xmax-$xmin + 2;
- ? ? ? ? my $yh = $ymax-$ymin + 2;
- ? ? ? ? $xmin -= 1;
- ? ? ? ? $ymin -= 1;
- ? ? ? ? $img->Crop(width=>$xw,serif; font-size:12px; line-height:1.8em"> ? ? ? ? my $out = './cut/'.$num.'.bmp';
- ? ? ? ? $img->Write($out);
- ? ?2. 识别
- ? ??
- use Image::Seek qw(loaddb add_image query_id savedb remove_id);
- my $img = Imager->new();
- my $file = './cut/'.$num.'.bmp';?
- $img->open(file => $file);
- add_image($img,10);
- savedb("imgdata.db");
- my @results = query_id(10); # What looks like this photo?
- remove_id(10); # Just remove id from database.
-
- ? ? ? ? print $results[1]->[0];
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|