转自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)-> 把第一个数字切割下来
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;
- }