ImageMagick基本編:Mogrifyを用いた画像の一括処理について


MogrifyはImageMagickと呼ばれる画像の作成・編集・合成・変換をするための統合ソフトにおいてコマンドで一括処理を行う際に用いるコマンドです。今回は、mogrifyを用いた画像の一括処理について記事として扱おうと思います。

では内容に入ります。

まず、ImageMagickについてもう少し詳しく解説します。ImageMagickは、ImageMagick Studio LLCによって開発されたソフトウェアスイート(複数のアプリケーションを一揃いとして提供するソフトウェア)であり、様々な拡張子の画像を、基本的にコマンドラインまたはプログラムから処理します。処理内容としては、画像のリサイズ反転回転拡張子の変更など多岐にわたります。また、プログラムでImageMagickを用いる場合、例えばC言語では、MagickWand APIMagickCore APIを用いて処理を行うことができます。ここでは深くは触れませんが、もし興味があるならば、使用言語に応じてここここなどを参考にすると良いと思います。また、ImageMagickはクロスプラットフォーム対応なので、LinuxだけでなくWindowsやOSXでも利用可能ですが、ここではLinux(Ubuntu)での処理を例に挙げて解説していきます。ImageMagickで画像の一括処理を行えるコマンドにmogrifyというものがあり、以下ではこれを利用していきます。画像を一枚一枚編集する際のコマンドとしてconvertというものもあるので、適宜使い分けていくと良いと思います。(shell scriptとconvertコマンドを組み合わせて使うことでも複数ファイルの処理を行うこともできます。mogrifyは処理を元画像に上書きして出力するため、別名保存したい場合はconvertの方が好ましいです。convertでは"convert <入力画像名> <処理内容> <出力画像名>"のようにして処理を行います。)

mogrifyでは入力画像に対して
  • リサイズ
  • 拡張子の変更
  • 回転
  • 切り取り
  • 色反転
  • グレースケール
  • 2値化
  • ぼかし
  • エッジ検出
  • モザイク
  • ノイズ除去
など様々なことを行うことができます。ここからは具体例としてこれらについてそれぞれ説明を行っていきます。以下でよく用いる"*.jpg"の中の*(アスタリスク)はワイルドカードと呼ばれ、ここでは「拡張子がjpgであるファイルをすべて対象とする」ことを意味しています。また例として使っている画像は以下の512x512の解像度をもつjpg画像(-formatにおける元画像はpng画像)であるものとして説明を行います。


リサイズ(-resize)

mogrify -resize 50% *.jpg
読み込んだ画像に入力した倍率(ここでは50%)をかけて、それを出力します。
mogrify -resize 256x *.jpg
読み込んだ画像を入力した横幅サイズ(ここでは256)として、入力画像と縦横の比率(ここでは256x256)を同じ状態でリサイズし、出力します。
mogrify -resize x256 *.jpg
読み込んだ画像を入力した縦幅サイズ(ここでは256)として、入力画像と縦横の比率(ここでは256x256)を同じ状態で出力します。


上記のコマンドを実行すると、いずれの場合も上図のような出力結果を得ます。
mogrify -resize 256x512! *.jpg
読み込んだ画像を入力した解像度(ここでは256x512)で出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。

拡張子の変更(-format)

mogrify -format jpg *.png
読み込んだpng画像をjpgに変換し出力します。今回はpngからjpgに変換しましたが他にもbmpやgif、ppmなど様々なフォーマットに対応しています。


上記のコマンドを実行すると、上図のような出力結果を得ます。

回転(-rotate)

mogrify -rotate 90 *.jpg
読み込んだ画像を入力した角度(ここでは90度)だけ時計回りに回転し出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。

切り取り(-crop)

mogrify -crop 128x128+192+192 *.jpg
読み込んだ画像を入力した大きさ及び座標(ここでは解像度128x128、切り取り開始座標(192, 192))で切り取り出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。

色反転(-negate)

mogrify -negate *.jpg
読み込んだ画像の色を反転して出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。

グレースケール(-colorspace)

mogrify -colorspace Gray *.jpg
読み込んだ画像をグレースケールに変換して出力します。この方法では、RGBの平均によりグレースケール化するのではなく、各色に重み付けすることでグレースケールにしています。


上記のコマンドを実行すると、上図のような出力結果を得ます。

2値化(-threshold, -monochrome)

mogrify -threshold 30000 *.jpg
読み込んだ画像に対して入力した輝度値(ここでは30000)を閾値としてこれ以上を白(n bitの画像に対して2^n - 1)、これ以下を黒(0)にして2値化を行い出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。
mogrify -threshold 50% *.jpg
読み込んだ画像に対して入力した輝度値の割合(ここでは50%)を閾値としてこれ以上を白(n bitの画像に対して2^n - 1)、これ以下を黒(0)にして2値化を行い出力します。画像はbit数に応じて階調が異なりますが、この場合、8bit(256階調)や16bit(65536階調)に対して同じ割合で2値化を行えることがメリットであると思います。


上記のコマンドを実行すると、上図のような出力結果を得ます。
mogrify -monochrome *.jpg
読み込んだ画像に対して2値化処理を行い出力します。"-monochrome"を用いた場合、2値化処理ですがディザがかかった感じの出力結果を得ます。


上記のコマンドを実行すると、上図のような出力結果を得ます。

ぼかし(-blur)

mogrify -blur 5x3 *.jpg
読み込んだ画像に対して入力したぼかす範囲(radius:ここでは5)およびぼかし量(sigma:ここでは3)で画像をぼかし、出力します。radiusはピクセル単位で指定し、sigmaは標準偏差で値が大きければ大きいほどぼかし具合は大きくなります。この他にもガウスぼかし(-gaussian-blur)や縁以外のぼかし(adaptive-blur)、モーションぼかし(-motion-blur)、回転ぼかし(-radial-blur)、閾値を指定したぼかし(-selective-blur)等があります。


上記のコマンドを実行すると、上図のような出力結果を得ます。他にも、Lowpass-Filterをかける(例:入力画像に対してFFTを行い、ガウシアンなどの窓関数をコンボリューションし高周波成分をカットしたあと、IFTを行う)などでも画像をぼかすことは可能です。

エッジ検出(-edge)

mogrify -edge 10 *.jpg
読み込んだ画像の色の変化の大きい部分を検出します。しかし、上のコマンドを実行しても、以下のようにエッジのみを検出できたとは言い難い出力結果を得ます。


そのため、グレースケールに変換しその後色を反転し、エッジ検出を行い、色を戻すために再び反転させることでエッジのみ検出した画像を出力します。これは以下のコマンドで実効可能です。
mogrify -colorspace Gray -negate -edge 1 -negate *.jpg
エッジ検出のオプションの後ろの数字はエッジ検出を行う際の度合いを表していてエッジのみを検出したい場合は大きすぎないほうが良いです。数値が10以上になると処理が遅くなります。


上記のコマンドを実行すると、上図のような出力結果を得ます。こちらも先ほどのぼかしと同様に、Highpass-Filterをかけるなどでもエッジ検出を行うことは可能です。

モザイク(-sample)

mogrify -sample 10% -sample 1000% *.jpg
読み込んだ画像のx%(ここでは10%)をサンプリングしたあと、サンプリングした画像の1ピクセルを10000/x%(ここでは1000%)にすることで元画像と同じ大きさのモザイク画像を出力します。


上記のコマンドを実行すると、上図のような出力結果を得ます。他にも特定の場所のみにモザイクをかけたい場合は、"-crop"でモザイクをかけたい場所を切り取りモザイクをかけ、"-geometry"で貼り付け座標を決定し、"-composite"で合成を行うなどで可能です。

ノイズ除去(-despeckle)

mogrify -despeckle *.jpg
読み込んだ画像のノイズ除去を行います。軽くblurをかけてぼかした感じ担っているのが解ると思います。特徴のあるピクセル(周囲のピクセルに比べて画素値が極端に異なるなど)に周辺のピクセル値の平均値や中央値などを書き込むことでエッジをなまらせた画像を出力することでノイズ除去を行う方法は画像処理の世界でもよく行われていることみたいです。


上記のコマンドを実行すると、上図のような出力結果を得ます。非常にわかりづらいですが、処理後の画像は、全体的にゆるくぼかされた画像になっていることがわかると思います。

ImageMagickでは他にも様々な処理を行えるので、気になった方は色々調べてみると面白いと思います。

以上

SHARE
Blogger Comment

0 コメント:

コメントを投稿