PerlMagick(ImageMagick)を使ってみた。

最近実験のために、大量の単純図形の入力刺激が必要だったため、PerlMagickを使ってみた。
便利な時代だの。

Windows 7でのインストール時に気をつけることは、PerlMagickのバージョンとActivePerlのバージョン。
最初ActivePerlの5.16をいれててうまくいかず、5.14にする必要があった。
PerlMagick: http://www.imagemagick.org/script/binary-releases.php#windows
ActivePerl: http://www.activestate.com/activeperl/downloads
ImageMagickインストール時に、ActivePerlのライブラリもインストールにチェックすれば、すんなり動くようになる。

例えば下記のようなコードを書いてみて、ファイルが出力されればOK

use Image::Magick;

$img = Image::Magick->new;
$img->Set(size=>'128x128');	
$img->ReadImage('canvas:rgb(128, 128, 128)');
$img->Draw(primitive=>'rectangle', stroke=>'black', fill=>'none', points=>'20,20 5,50');
binmode(STDOUT);
$img->Write("PNG24:img.png");
undef $img;	

他の例は公式サイト(http://www.imagemagick.org/script/perl-magick.php#example)とかを参照


今回の目的は、背景色が灰色(#808080 / RGB(128,128,128))で、
n角形で各辺がp通りの曲度を持つという、計n^p個の入力刺激の生成。
色々方法はあるけど、計算量が馬鹿でかくなっては嫌だし、かといって頭をつかうのも嫌だということで、その中間をとってこうすることに。

  1. 中央から頂点までの長さsを定める
  2. for(i が n^p まで)
    1. for(j が 頂点数まで)
      1. 長さsと頂点数から一辺の長さを求め、キャンバスの適切な位置にその長さの水平線を(int(i/(p^j)))%p)番目の曲度で引く。(説明は省略)
      2. 360/頂点数 の角度回転
    2. ColorFloodfillで図形内を塗りつぶし
    3. 回転したせいでキャンバスがでかくなってるから、最初のキャンバスサイズにクロップして出力。

という中途半端な感じで。

このプログラムは実はどうでもよくて、
このファイルをフィルターかけるためにMatLabで読み込んでみると、背景色が128ではなくなんか巨大な数であるという。
確かに、RGB(128,128,128)の色よりも濃く表示されてる。

本当はこの色にしたい↓
■■■

ディスプレーに映ってる色をプログラムで出力して、映される色が128になるようにmanuallyにコードを書き換えてみても当然うまく行かず。


で、気づいたんだけど、png出力の形式を指定し忘れてた。
PerlMagickで出力できるpngにはPNG8, PNG24, PNG32の3種類がある。

binmode(STDOUT);
$img->Write("PNG:img.png");

とかすると、プログラムが勝手に最も効率的そうな形式を上記の3つから選んでくるのだそうだ。
どうやら今回の場合は、ただのグレースケールの画像なのに、素敵なことに勝手にPNG32を選んで出力してくれていた模様。

といわけで、

binmode(STDOUT);
$img->Write("PNG24:img.png");

と指定することで、無事それっぽい色となり、

無事背景がmatlabで128と認識されましたとさ。

みなさんもこんな馬鹿な見落としで時間を無駄にしないようにしましょう。笑