作者: dune
日時: 2003/7/28(02:59)
極悪です。

あいかわらず静かなので雑文を。

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?