ImageMagickによる基本的な画像処理

ImageMagickの基本的な使い方

ここでは、衛星画像を題材にして、ImageMagickの基本的な使い方を説明しています。 Windowsで演習する場合には、前提として、Cygwin、ImageMagickの インストールが済み、PATHも設定してあるものとします。 ちなみに、LinuxではImageMagickの各コマンドがインストールさ れていることが多いので、Linux環境の人はすぐに下記の演習内容を試すことが できるはずです。

ImageMagickの中でも、

を使用します。特に、convertはよく使用しますので、使い こなせるようになってください。

この演習で処理した画像例は、 このページの末尾に掲載されていますので、 参照してください。

  1. 画像の保存

    まずは、以下の演習で使用する画像(JPEG画像:バンド1〜7)を保存しよう。

    [バンド1] [バンド2] [バンド3] [バンド4] [バンド5] [バンド6] [バンド7]
    (全て画像サイズは、横500、縦375)

  2. フォーマット変換:

    convertの基本は画像のフォーマットを自動的に 変換してくれると言える。通常は下記のように拡張子だけ変更 すれば、勝手に変換してくれる(下記はJPEG画像からPNG画像への変換例)。

    $ convert   tm931028b1.jpg   tm931028b1.png

    rawフォーマット (へッダなしの単にデータが記述されたフォーマット: Photoshopでの「汎用フォーマット」)から、他のフォーマットへ変換する場合 には、階調(depth)と、画像サイズ(size)を指定しなくてはならない。

    $ convert -depth 8 -size 500x375 gray:tm931028b1.raw   tm931028b1.jpg
  3. 画像のサイズ変更

    画像サイズ500(横)×375(縦)の画像を100×75に縮小したい時(20%の縮小)

    方法1:

    $ convert   -geometry 100x75   tm931028b1_org.jpg   tm931028b1.jpg

    方法2:

    $ convert   -geometry 20%x20%   tm931028b1_org.jpg   tm931028b1.jpg

    方法3:(縦、横の縮小比率が同じであれば下記の方法でも成功する)

    $ convert   -geometry 20%   tm931028b1_org.jpg   tm931028b1.jpg
  4. 画像の強調

    Webページを検索して参照すると、「-normalize」というオプションを使えばで きるように書いてあるところがあったが、今回使用している画像に適用すると コントラストが強調されるどころか、真っ黒に表示されてしまった。また、 他に可能性のあるオプションとして、「-contrast」「-enhance」も試してみた が、同様の結果となった。「-equalize」を試したら良好な結果だったので、 ここに紹介する。

    $ convert   -equalize   tm931028b1.jpg   tm931028b1_equalize.jpg
  5. 複数枚の画像のRGB合成

    第1段階:赤画像に緑画像の重ね合わせ

    $ composite -compose CopyGreen tm931028b3.jpg   tm931028b4.jpg   tmp.jpg

    第2段階:赤緑画像に青画像の重ね合わせ

    $ composite -compose CopyBlue tm931028b2.jpg   tmp.jpg   tm931028b432.jpg
  6. 画像の回転、反転

    下記の見本のように、-rotateを使用すれば、任意の 回転角度を与えることができる。

    時計回りに30度回転:

    $ convert   -rotate 30   tm931028b1.jpg   tm931028b1_rotate.jpg

    一方、上下反転には-flip、 左右反転には-flopというオプションを使用しても可能である。

    上下反転:

    $ convert   -flip   tm931028b1.jpg   tm931028b1_flip.jpg

    左右反転:

    $ convert   -flop   tm931028b1.jpg   tm931028b1_flop.jpg
  7. 画像の2値化

    白、黒に分ける(2値化)境界の階調を指定し、処理

    下記の例では、輝度値30以上の場合には白、30未満の場合には黒へ変換される。

    $ convert   -threshold 30   tm931028b1.jpg   tm931028b1_thresh.jpg

    下記の例では、輝度値120以上の場合には白、120未満の場合には黒へ変換される。

    $ convert   -threshold 120   tm931028b1.jpg   tm931028b1_thresh.jpg
  8. その他の処理

    枠をつけて出力:border

    $ convert   -border 10x10 -bordercolor red   tm931028b1.jpg   tm931028b1_border.jpg

    中間値:median

    $ convert   -median 10   tm931028b1.jpg   tm931028b1_median.jpg

    ぼかし:blur

    $ convert   -blur 10   tm931028b1.jpg   tm931028b1_blur.jpg

    エッジ抽出:edge

    $ convert   -edge 10   tm931028b1.jpg   tm931028b1_edge.jpg

    エンボス:emboss

    $ convert   -emboss 10   tm931028b1.jpg   tm931028b1_emboss.jpg

    間引き1:sample

    $ convert   -sample 10%   tm931028b1.jpg   tm931028b1_sample1.jpg

    間引き2:sample
    下記の例では、同じサイズのモザイク画像が作成される(はず?)。

    $ convert   -sample 10% -sample 1000%   tm931028b1.jpg   tm931028b1_sample1.jpg

シェルスクリプトを活用した一括処理

例えば、同一の処理を、ファイル名が異なるだけで何回、何十回も繰り返す状況 を想定してください。結構面倒くさいですし、うっかり間違った処理を行う危険 性もあります。したがって、ここで紹介するような一括処理を利用した方が いいという状況はよくありますので、参考にしてください。

  1. mogrifyの使用

    mogrifyは、convertに比べて、複数の画像に対する処理を一括して行うことがで きる。

    JPEG画像全てを、PNG画像に変換:

    $ mogrify -format png *.jpg

    JPEG画像全てを、画像サイズを変えて上書き保存:

    $ mogrify -geometry 100x75 *.jpg

    同じ拡張子であっても処理する画像と処理しない画像が混在しているとき には使用しづらく、その場合には下記に列挙するシェルスクリプトを使用する のが適切と思われる。

  2. シェルスクリプトの活用

    UNIXの世界では、同じ作業を複数回繰り返すときなど、 シェルスクリプトとよばれるファイルを作ることがよくある。 例えば、下記のall_convert.shというシェルスクリプトの例では、 for文を使った繰り返し処理を実現している。C言語などのfor文と 多少文法が異なるので、注意を要する。

    all_convert.shの中身

    #!/bin/bash
    
    for num in 1 2 3 4 5 6 7
    do
        convert  tm931028b${num}.jpg  tm931028b${num}.png
    done
    

    上記の1行目は「#!/bin/bash」と記述することで、「/bin/bashの文法に基づく 処理を行うシェルスクリプトですよ」と明示している。

    3行目のfor文で、numという変数に1から2、3、…、7まで数字が代入されていく。 そのたびに、do〜doneの中身が実行される。 変数numの値を利用するには、 $numまたは${num}のように指定する必要がある。

    保存後、「./all_convert.sh」のよ うに指定することで、シェルスクリプトの中身が実行される。

    all_convert.shの実行方法1

    $ bash all_convert.sh

    all_convert.shの実行方法2

    $ chmod +x all_convert.sh
    $ ./all_convert.sh

    実行方法2では、最初に実行可能なパーミッションを 与えている。これにより、2行目の指定でシェルスクリプトの内容が実行される。

    シェルスクリプトに関する基本的な説明は省いてあるが、もう少し 詳細を知りたい場合には、 「シェルスクリプトの基本」のWebページを参照されたい。

    ちなみに、上記のmogrifyの命令をシェルスクリプトで書くと、下記のような 形になる。「newfile」という変数に、拡張子をpngに変更したファイル名を 代入している。また、通常のコマンド使用に置いては、 「ls *.jpg」で拡張子がjpgのファイルを一覧表示させるが、ここでは 「$(ls *.jpg)」とすることで、 拡張子がjpgのファイル一 つ一つに対して処理を適用する、という意味になる。

    #!/bin/bash
    
    for file in $(ls *.jpg)
    do
        newfile=`echo $file | sed 's/jpg/png/'`
        convert  $file  $newfile
    done
    

ImageMagickの基本処理による画像例

バンド1 バンド2 バンド3 バンド4
バンド5 バンド6 バンド7 composite(R:G:B=バンド4:3:2)
equalize rotate flip flop
threshold border median edge
emboss sample(例1) sample(例2)

Cygwin、ImageMagickによる画像処理のページに戻る
須崎純一トップページに戻る
須崎純一 京都大学大学 工学研究科都市環境工学専攻 環境情報学講座