转自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);
- use Image::Magick;
-
- for my $num (0..9){
-
- my $image = new Image::Magick;
- 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';
- $image->Write($out);
-
- $image = undef;
-
- }
-
- exit;
复制代码
4.存入到 图片库里
-
- use Imager;
-
- use Image::Seek qw(loaddb add_image query_id savedb);
-
- loaddb("imgdata.db");
-
- for my $num (0..9){
- 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 List::Util qw(max min);
-
- use Image::Magick;
- use LWP::Simple;
-
- my $url = '****'; # 为了不惹麻烦 把测试网站删除了
- my $file = './cut/tmp.bmp';
- getstore($url, $file);
-
- for my $num (0..3){
- my $image = new Image::Magick;
- $image->Read($file);
- my ($w, $h,) = $image->Get('width', 'height');
- $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,@px_y);
- for my $x(0..$w){
- for my $y (0..$h){
- my $px = $img -> 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;
-
- $img->Crop(width=>$xw, height=>$yh, x=>$xmin, y=>$ymin);
-
-
- my $out = './cut/'.$num.'.bmp';
- $img->Write($out);
-
- $img = undef;
- }
2. 识别
-
- use Imager;
-
- use Image::Seek qw(loaddb add_image query_id savedb remove_id);
-
- loaddb("imgdata.db");
-
- for my $num (0..3){
- 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];
- }