Ubuntu Weekly Recipe

第102回ImageMagickでコマンドラインから画像加工

今回は、コマンドラインから画像加工を行えるImageMagickを取り上げます。画像加工ならGIMPやF-Spotを使えばいいのに、⁠なぜコマンドラインから?⁠と思われるかもしれませんが、コマンドラインならではの利点もあります。

例えば、数百枚の画像に同じ処理を施す場合、GIMPで1枚1枚手作業で処理するのに比べて、コマンドラインやスクリプトから一括で処理した方が、時間も労力もかかりません。

ImageMagickは数多くの機能を備えていますが、その中からデジカメで撮影後の写真を加工する用途を中心に紹介していきます。

ImageMagickのインストール

インストールは、[アプリケーション]-[アクセサリ]-[端末]を開いて以下のコマンドを実行します。

$ sudo apt-get install imagemagick

ImageMagickのドキュメントをインストールする場合は、以下のコマンドも実行します。

$ sudo apt-get install imagemagick-doc

インストールしたドキュメントを閲覧するには、Firefoxのアドレス欄に以下を入力します。

file:///usr/share/doc/imagemagick-doc/index.html

ドキュメントを開いてみるとわかりますが、これはImageMagickのホームページとほぼ同一のものです。

ImageMagickの基本

ImageMagickでは、画像を変換する場合に「convert」「mogrify」というコマンドを用います。⁠mogrify」コマンドを使ってしまうと元画像を書き換えてしまうため、新たなファイルとして保存する「convert」コマンドを使うのがよいでしょう。

例として、カレントディレクトリ内に保存されている写真「P001.jpg」のJPEG圧縮率を90%に変更して「converted_P001.jpg」という名前で保存してみます。以下のコマンドを実行します。

$ convert P001.jpg -quality 90 converted_P001.jpg

ただし、このようにImageMagickを使うだけでは、GIMPで写真を開いて、ファイルの保存ダイアログで、圧縮率を指定するのと手間が変わりません図1⁠。

図1 GIMPの保存ダイアログでJPEGの品質を指定するところ
図1 GIMPの保存ダイアログでJPEGの品質を指定するところ

そこで、⁠xargs」というコマンドと組み合わせて使い、カレントディレクトリ内のJPEGファイルすべてに同じ処理を施してみます。以下のコマンドを実行します。

$ ls *.jpg | xargs -I{} convert {} -quality 90 -verbose converted_{}

このコマンドでは、lsコマンドでカレントディレクトリ内のJPEGファイルをリストアップし、その出力をxargsコマンドに渡します。xargsコマンドは、与えられたファイル名を{}の部分に代入して、JPEGファイルの数だけconvertコマンドを実行してくれます。

例えば、カレントディレクトリ内に「P001.jpg, P002.jpg, P003.jpg, ...」というファイルがあった場合は、変換後の画像を「converted_P001.jpg, converted_P002.jpg, converted_P003.jpg, ...」と保存してくれます。

なおここでは、処理状況を表示させるため「-verbose」オプションを追加しています。

輝度、彩度の変更

「-modulate」オプションを用いると、簡単に輝度と彩度が変更できます。ただし、この操作が行われるのはHSL色空間です。

-modulateオプションは3つの値を取り、⁠輝度(Lightness)」⁠彩度(Saturation)」⁠色相(Hue)」の順にパーセントの値で指定します。値が指定されない場合は100%が指定されたものと解釈されます。

輝度を110%、彩度を130%に上げる場合は、以下のように実行します。

$ convert P001.jpg -modulate 110,130 converted_P001.jpg

この操作は、元の画素の持つ値に対して、-modulateオプションで指定した値を掛ける動作をします。これは、GIMPメニューの[色]-[色相-彩度]図2とは全く異なる動作です。GIMPと似たような動作をさせる場合は、以下のように指定します。

$ convert P001.jpg -colorspace HSL \
-channel B -evaluate Add 10% \
-channel G -evaluate Add 30% \
-colorspace RGB converted_P001.jpg

このコマンドでは、まず画像をHSL色空間に分解し、チャンネルごとに値を加えています。そして最後にRGB色空間に戻して保存しています。

操作するチャンネルの指定方法ですが、ImageMagickではRGBの3文字しか使えません。HSL色空間ではHを操作したい場合はRを、Sの場合はGを、Lの場合はBを指定してください。

また、加える値をパーセントではなく直接指定する場合の値の範囲ですが、ImageMagickでは内部でチャンネルごとの値を16bitで持っているため、0から65535までです。

図2 GIMPの[色相-彩度]ツール
図2 GIMPの[色相-彩度]ツール

レベルの調整

明度(Value)のレベルを調整するためのオプションはいくつかありますが、ここでは「-linear-stretch」を紹介します。

-linear-stretchは、GIMPの[色]-[トーンカーブ]ツールを使って、黒と白の基準点を決め、その間を直線で結ぶ操作に相当します図3⁠。

図3 GIMPの[色]-[トーンカーブ]ツール
図3 GIMPの[色]-[トーンカーブ]ツール

ただし、画像1つ1つごとに、黒と白の基準点を手作業で指定していくことは難しいので、-linear-stretchでは黒と白の基準点をパーセントで指定します。

例えば、100万画素の画像で、白の基準点を1%と指定した場合、ImageMagickは明度の大きい順に画素を数えていきます、そして、100万画素の1%である1万画素目を白の基準点とします。よって、少なくとも1万画素は、真っ白な画素になります。

黒の基準点は変更せずに、明度の上位1%の点を白の基準点にするには、以下のコマンドを実行します。

$ convert P001.jpg -linear-stretch 0x1% converted_P001.jpg

変換画像の確認

ここまで紹介した内容を使って、彩度を20%上げ、明度を調整し、圧縮率を90%で指定して保存してみます図4⁠。ただし、ここでは変換前と変換後をわかりやすくするため、それぞれを左右に並べるオプションを追加しています。

$ convert P001.jpg \
\( +clone -modulate 100,120 -linear-stretch 0x1% \
-gravity East -crop 50%x100%+0+0 \) \
-composite -quality 90 compare_P001.jpg
図4 左側が変換前の画像、右側がImageMagickを使って変換した後の画像
図4 左側が変換前の画像、右側がImageMagickを使って変換した後の画像

この結果でよければ、以下のコマンドでカレントディレクトリ内のJPEGファイルすべてを変換します。

$ ls *.jpg | xargs -I{} convert {} \
-modulate 100,120 -linear-stretch 0x1% \
-quality 90 -verbose converted_{}

写真の撮影日時の修正

ImageMagickは、様々な機能を持ち、ほとんどの画像操作がImageMagickでできてしまいます。

しかし、他のツールを使った方が効率がよい場合もあります。その例としてExif情報内の撮影日時の変更を取り上げ、⁠jhead」というツールを紹介します。

インストールは以下のコマンドを実行します。

$ sudo apt-get install jhead

画像のExif情報を取得するには、以下のようにファイル名を渡します。

$ jhead P001.jpg

すると、以下のようにExif情報が表示されます。

File name    : P001.jpg
File size    : 5292795 bytes
File date    : 2008:04:12 01:21:22
Camera make  : CASIO COMPUTER CO.,LTD.
Camera model : EX-V7      
Date/Time    : 2007:08:22 13:14:51
Resolution   : 3072 x 2304
Flash used   : No
Focal length :  6.3mm  (35mm equivalent: 38mm)
Exposure time: 0.0025 s  (1/400)
Aperture     : f/4.6
ISO equiv.   : 64
Whitebalance : Auto
Metering Mode: matrix
Exposure     : program (auto)

撮影時刻を3時間進ませる場合は、⁠-ta」オプションを使って以下のように実行します。

$ jhead -ta+3:00:00 *.jpg

また、先ほど取得したExif情報のカメラモデルの項目を使って、特定のカメラで撮影された写真にのみ変更を加えられます。⁠EX-V7」で撮影された写真のみ撮影時刻を5分戻す場合は、以下のように実行します。

$ jhead -model 'EX-V7' -ta-0:05:00 *.jpg

年月日を操作する場合は、単純に365日を加算したりするのではなく[1]⁠、基準となる1枚の変更後の撮影年月日と変更前の撮影年月日を引き算の形で表して以下のように指定します。

$ jhead -da2009:12:23-2000:01:01 *.jpg

来週12月30日はお休みです。次回は1月6日に掲載の予定です。

みなさま良いお年を。

おすすめ記事

記事・ニュース一覧