2009年12月10日木曜日

FreeBSDでPerlMagick(その3)画像の加工

この投稿はFreeBSDでPerlMagick(その2)図と文字を描くからの続きです。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。

(9) Rotation:図の回転

図の回転は次のように書く。
use Image::Magick;

my $img = Image::Magick->new;
$img->Read($target_pict);
# ------------------------------
$img->Rotate(degrees => 90);
# ------------------------------
$img->Write($newname);
undef $img;
ここで90時計回りに90°回転させることを意味している。
オリジナルRotation 90を実行した結果Rotation 45を実行した結果


(10) Resize:図の大きさの変更

Resize は以下のように記述する。ここからは,加工の処理の部分のみを書くことにする。
$img->Resize(width => 80, height => 60, blur=>0.5);
この8060が新しいサイズを表している。もとの画像の縦横比と異なる場合については,Resizing or Scalingを読んでみて欲しい。また,blur=>0.5は以前の投稿でも書いたが,画像をどの程度ぼかすかを表す指標であり,1より小さいと多少シャープになる。1より大きいとかなりぼんやりした図になる。
オリジナル (160x120)80x60にResizeした


(11) Crop:図の切り取りとTransformを使ったCropping

図の一部を切り取る処理をCrop という。Crop は以下のいずれかのように書く。いずれでも同じように切り取れる。
$img->Crop(width=>120, height=>120, x=>40, y=>40); # 作戦 1
$img->Crop(geometry=>'120x120+40+40'); # 作戦 2
$img->Crop('120x120+40+40'); # 作戦 3
ここでwidthheight は切り取る幅と高さであり,xy は,左上を原点にした時の切り取る座標の左上の点の位置である。PerlMagickのサイトでは,gravity オプションが選べるように書いてあるが,やってみるとうまくいかなかった。(gravity オプションについてはFreeBSDでPerlMagick(その2)図を描く (8) Annotate を用いた文字の描画を見て欲しい) 調べてみると,以下のように書くとよいとのことだった。
$img = $img->Transform(crop=>'120x120+40+40', gravity=>'SouthWest');
ここでgravitySouthWest なので左下が原点となっている。このTransform というコマンドはPerlMagick のサイトのコマンド一覧には見当たらず,サイトの下の方に書いてあってなかなか気付かなかった。困ったものだ。
オリジナル (160x120)120x120+40+40で
Cropしたもの
左下を原点にして
120x120+40+40で
Cropしたもの


(12) Blur:ぼかす

ぼかすにはBlur を使う。他にRadial BlurGaussian BlurMotion Blur などがある。
$img->Blur('0.0x1.0');
$img->RadialBlur(5);
$img->MotionBlur('0x13+10-10');
Blue の引数はradius x sigma であり,sigma はどれぐらい周りまでの点を使ってぼかすかという半径をpixelで表したものであり,radius は実際の計算でどれぐらいの距離までを用いるかを表す。(ちょっとわかりにくいが,ぼかしのために sigma ぐらいの距離で減衰する関数を使うけど,計算には sigma より広い範囲まで使わないといけないので,それを radius で表している,ということ)radius に関してはsigma の3倍ぐらいがいいらしいが,radius をゼロにすると自動的に最適な値を使ってくれるらしい。Radial Blur の引数は度で表した角度である。Motion Blurの引数についてはOptionsを見て欲しい。Blurring and Sharpening Imagesにぼかし関連の説明がある(英語だけど)
オリジナル (160x120)Blur (0x1)Radial Blur (5)Motion Blur (0x13+10-10)


(13) Sketch, Spread, OilPaint:絵画風の加工

絵画風の加工を幾つか示そう。Sketch は引っかいたような雰囲気にしてくれる。ただし,元の画像が大きいと処理に時間がかかることがあるので注意が必要である。Spread は拡散処理。一種のぼかし加工と言えるかもしれない。OilPaint は油彩画風にしてくれるもの。
$img->Sketch(radius=>0, sigma=>10, angle=>135);
$img->Spread(radius => 2);
$img->OilPaint(radius => 2);
引数についてはOptionsを見て欲しい。
オリジナル (160x120)SketchSpreadOilPaint
Image Magick に関する最初の投稿で紹介した画像処理についてあれこれ に書いてあったのだが,油彩画風にするには,いきなりOilPaint の処理をするのではなくて,SketchSpread の処理をしてから最後にOilPaint の処理をするのがいいみたい。以下がその結果。


(14) Vignette:縁飾り

写真の周りを白っぽくぼかす縁飾りをVignette という。Image MagickでのVignette は縁を白以外の色にすることもできる。以下のいずれかのように書く。
$img->Vignette(geometry=>'0x10+0+0',background=>'White'); # 作戦 1
$img->Vignette(geometry=>'0x7+5+5',background=>'black'); # 作戦 2
ここでgeometryradius x sigma+x+y であり,sigma はぼかす幅,radius はぼかし計算に使う領域の半径(ゼロにセットすると自動で最適化してくれる),xy は,上下左右の端から縁取りまでの距離を表す。
オリジナル (160x120)geometry=>'0x10+0+0'
background=>'White'
geometry=>'0x7+5+5'
background=>'black'


FreeBSDでPerlMagick(その4)図形の描画と画像の加工に続く

0 件のコメント: