極悪です。
あいかわらず静かなので雑文を。
ActivePerl を v5.8 にして以来、GD も Image::Magic も
ActiveState の ppm が用意されてないのでインストールできず、
仕方なく PurePerl の Image::Xpm なんてのを入れて使っていま
した。
その後 GD はバイナリを見つけたので ppm ですんなり入りました
が、デジカメで撮った画像を加工したかったので、画像を作ること
はできても読んで解析することができない GD ではやりたいことの
半分しかできず困ってました。
んで今週末(先週末)いろいろ調べた挙げ句(というか Google で
検索したら一発だった)、Image::Magic のホームページを見つけ
て、そこから ppm でモジュールをインストールしたのですが(
※)、いざ呼び出して使おうとするとメソッドの戻り値がことご
とく undef になって全然動きません。同じスクリプトが昔の
JPerl ではまともに動くので、v5.8 用の Image::Magic はまだな
いのかと諦めかけていました。
しかし、やっと、原因がわかったのです。環境変数を設定していな
いのが原因でした。Image::Magic の DLL があるフォルダのパスを
MAGICK_HOME と PATH に設定しなければいけなかったのです。僕の
環境では、
MAGICK_HOME=C:\usr\Perl800\site\lib\auto\Image\Magick
PATH=...;c:/usr/Perl800/site/lib/auto/Image/Magick;
という具合になります。マニュアルのどこかに(英語で)書いてあ
るのですが、無意識のうちに読み飛ばしていたようで・・・。
そういうわけで今はデジカメで撮った画像から点の座標を求めて
Excel で読み込んでグラフにして、なんてことをやってます。
夏休みの自由研究(って今どきあるのか?)に、画像処理なんてお
もしろいかもしれません。
(※)Image-Magick のインストール(この後、環境変数の設定が
必要):
ppm> rep add beau http://ppm.beaucox.com
Repositories:
[1] ActiveState Package Repository
[2] savage.net
[3] crazy
[4] theoryx5.uwinnipeg
[5] beau
ppm> i Image-Magick-Full
====================
Install 'Image-Magick-Full' version 5.5.7 in TEMP.
====================
Downloaded 5573379 bytes.
Extracting 270/270: blib/lib/Image/Magick.pm
Installing C:\usr\Perl800\site\lib\auto\Image\Magick\analyze.dll
Installing C:\usr\Perl800\site\lib\auto\Image\Magick\colors.mgk
Installing C:\usr\Perl800\site\lib\auto\Image\Magick\CORE_DB_bzlib_.dll
〜〜〜
Installing C:\usr\Perl800\site\lib\Image\Magick.pm
Successfully installed Image-Magick-Full version 5.5.7 in TEMP.
ppm>
画像を二値化するスクリプト:
#!/usr/local/bin/perl -w
use strict;
use Image::Magick;
### pixel - pixel($image,$x,$y) - 読み出し
### - pixel($image,$x,$y,$color) - 書き込み
###-----------------------------------------------------------------//
sub pixel{
my($i,$x,$y,$p) = @_;
if(defined $p){
$i->Set("pixel[$x,$y]"=>$p);
}else{
$p = (split(',',$i->Get("pixel[$x,$y]")))[0];
}
return $p;
}
### ファイル読み込んで情報表示
###-----------------------------------------------------------------//
my $file = shift or die qq(usage: $0 foo.jpg\n);
my $image = new Image::Magick or die $!;
$image->Read(filename => $file);
my $size = $image->Get('filesize') >> 10;
my($wx,$wy) = $image->Get('width','height');
print STDERR qq/$file: $wx\[dot] x $wy\[dot] = $size\[KB]\n/;
### 閾値を決める(↓この方法に理論的な裏付けはないけどね)
###-----------------------------------------------------------------//
$image->Quantize(colorspace=>'gray');
my($th,$ith,$pa,$pb,$pc,$pd,$dab,$dbc,$dcd);
foreach my $y (0..$wy-1){
$pa = pixel($image,0,$y);
$pb = pixel($image,1,$y);
$pc = pixel($image,2,$y);
$dab = $pb - $pa;
$dbc = $pc - $pb;
foreach my $x (3..$wx-1){
$pd = pixel($image,$x,$y);
$dcd = $pd - $pc;
if(0 < $dab and 0 < $dcd){
if($dab * 6 < $dbc and $dbc > $dcd * 6){
$th += $pa + $pb + $pc + $pd; ++$ith;
}
}elsif(0 > $dab and 0 > $dcd){
if($dab * 6 > $dbc and $dbc < $dcd * 6){
$th += $pa + $pb + $pc + $pd; ++$ith;
}
}
($pa,$pb,$pc,$dab,$dbc) = ($pb,$pc,$pd,$dbc,$dcd);
}
}
$th = ($th / $ith) >> 2;
print STDERR "Threshold: $th\n";
### 二値化する
###-----------------------------------------------------------------//
#$image->AdaptiveThreshold(geometry=>"200x300");
$image->Set(monochrome=>'True');
$image->Threshold(threshold=>$th);
### ファイルに保存
###-----------------------------------------------------------------//
$image->Write(filename=>"aout.jpg");
__END__
関係ないですが、ネット上の古本屋に Kohonen 著の「自己組織化
マップ」が出てたので思わず買ってしまいました。perl のモジュー
ルにある AI::NeuralNet::SOM の SOM です。この本は
藤岡さんも持ってるかも。僕は第一章第一節の「数学的準備」の項
を眺めて挫折しました。訳は鳥取大学の教授。鳥大は N-gram もやっ
てるようです。N-gram とか SOM 関係の公開講座みたいなのをやっ
てくれないかな。画像処理もデータマイニングもパソコンの性能が
上がって挑戦しやすくなりました。
--
http://hpcgi1.nifty.com/dune/gwiki.pl?