画像解析ソフトウェア ImageJ

オープンソースの画像解析ソフトであるImageJを紹介しようと思う。開発はアメリカ国立衛生研究所(NIH)で、Javaで作られている。

2013.02.09 現在
最新バージョン: ImageJ 1.47i
3.1MB
これに Java の JVM を含む jre が必要。すでに PC にインストールされていれば、本体だけダウンロードすれば使える。Java で作られていることもあって、かなりコンパクトなファイルサイズになっている。一度インストールすれば、Help メニューからのアップデートで簡単にバージョンアップができる。

2011.4.19
そもそもJavaで作られたアプリケーションなんて珍しいと思って使ってみたのがはじまり。使ってみたら意外と実用的で快適だったので、それ以来手放せなくなっている。

主に医療、科学分野で利用されている画像解析ソフトだが、個人的に解析するようなことはないので、Blogや仕事で使う画像の加工などに利用している。基本的な画像処理なら問題なく出来るし、重装備画像処理ソフトと比べて動作が軽いのでストレスがない。ということで、ここ数年はずっとImageJばかり使って、Photoshopなんて起動もしなくなってしまった。見た目は上の画像の通り、メニューバーのみで、画像処理ソフトらしからぬ質素なインターフェイスだが、それが返って使いやすかったりする。

個人的に気に入っているところは、以下のようなところ。

無料:

オープンソース&パブリックドメインのソフトウェアである。これは重要。

Java製画像解析ソフト:

個人的にJavaが好きなのでJava製というだけでポイント高い。

Javaなのに高速処理できる:

Javaは遅いというイメージを払拭する出来映え。ネイティブで処理しているんじゃないか?と疑うぐらい高速。

マルチプラットフォーム:

Windows, Mac, Linux で利用可能。Javaならではのメリット。

シンプルなツール:
メニューバーだけ。画面を占領せず控えめな印象であるが、機能は強力で使い勝手はよい。他の画像処理ソフトみたいにパレットだらけにならないところが快適。

起動がまぁまぁ速い:

ImageJは数秒で起動。Javaの起動スピードが、ややもっさりしているので、それほど速いというわけではない。それでも処理内容からすれば我慢できる待ち時間といえる。いくら高機能でも起動に30秒以上もかかる重装備の画像処理ソフトは使ってられない。

独自フォーマットを持たない:

あくまでも汎用フォーマットを扱う。そのため他の画像ソフトによくあるレイヤーのような機能はTIFFフォーマットで補っている。やや使い勝手に癖があるものの、レイヤーらしいことはできる。フォトショップと同じ感覚で使えると思ったら大間違いで、とっつきにくい印象になるかもしれない。

強力な画像解析ツール:

フィルターなど数値を使って細かく設定可能でマニアックな機能がてんこ盛り。画像処理の勉強にもなる。
例えば、こんな感じでフィルタの係数を直接入力することもできる。
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 24 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1

アプリのサイズが小さい:
exeは165KBしかなく、ij.jarは1522KBという具合。これもJavaのメリット。JVMがデカイのだけど・・・。

ショートカットいくらでも

ショートカットの自由度が恐ろしく高い。あらゆるコマンドのショートカットが可能と思われる。自分のよく使うショートカットを設定しておけば、効率よく作業ができる。
Plugind > Shortcuts > List Shortcuts...
で現在のショートカット設定を確認できる。独自のショートカットは*印が付いている。
ショートカットを設定するときは、
Plugind > Shortcuts > Create Shortcuts...
で設定する。
しかし独特ではある。ショートカットは普通コピー&ペーストであれば、ctrl c、ctrl vといった流れであるが、ImageJでは、c vだけで出来てしまう。また大文字小文字も別に扱われるので、x と shift x では違うコマンドとして認識される。

必要な情報はちゃんと表示されている

画像イメージタイプやサイズなどが、画像上にしっかり表示されている。こういうさりげない部分がとても実用的だったりする。

カスタマイズいくらでも

UNIX系で有名なテキストエディタ「Emacs」のような印象がある。とっつきにくいけど、一度快適な環境までカスタマイズすることで手放せなくなるという点で一致している。ImgeJのカスタマイズの自由度は高く、プラグインの追加でいくらでも変えられる。ImageJそのものがプラグインの固まりと言ってよいと思う。

Webとの相性がよい

ブラウザから、ImageJへドラッグ&ドロップするだけで、オリジナルファイルがちゃんとダウンロードされて、ImageJで開くことができる。これはかなり便利。Javaの強みを最大限に発揮しているように思う。実際メニューからサンプルを開くときも、ネットワーク経由でダウンロードしてくる仕様だし。

プラグインが豊富

オフィシャルホームページへ行くと膨大なプラグインが用意されている。専門的なものも多く実践的な印象。多くは個人的に必要性を感じたことはないのだが、これだけのものを無料で利用できるというのはすごい。
http://rsb.info.nih.gov/ij/plugins/index.html
また、Javaの知識があれば、自らプラグインを作ることも簡単。APIはオフィシャルからダウンロードできる。javaで書いたソースファイルをImageJでコンパイルして、すぐに実行できる。お手軽だ。

意外と操作性がよい

操作が明確でダイレクト。例えば別名保存するとき、File > Save As > から拡張子まで一気に指定できてしまう。何度も何度もクリックするようなことはない。画像処理の場合何十枚も処理することも多く、効率よく作業できるか否かで評価が大きく分かれてしまう。全く同じ作業ならマクロを組めばよいのだが、実際は微妙に違うことも多く、標準の状態で工数が少ない操作性が求められる。
また画面のキャプチャーなどもよくやるのだが、WindowsだとPrintScreenボタンを押して、ImageJにペーストするだけで適切な新規画像として表示される。もっとも画面全体のキャプチャーは、ImageJには、すでにコマンドとして用意されている。shift g 一発でOK。実際よく使っているのはウィンドウごとのスクリーンショット。つまりAlt PrintScreen でアクティブウィンドウのみキャプチャーを行い、ImageJにペーストするという流れ。

では問題点は何か?

マニュアルが英語だというところかな。ImageJの日本語版もないと思われる。ということで日本語情報があまりないように思う。マニュアルには使い方だけでなく技術的な解説もされていて勉強になる。画像処理の仕組みを知るにも良い。
今調べたら、こういうサイトはあるのね。
http://wiki.livedoor.jp/imagej/



ImageJ 機能や設定方法の紹介

ImageJは、やや癖があるソフトなので、独特の操作に慣れないと使い勝手が悪く感じるかもしれない。いくつか分かりにくかった機能や設定を紹介していこうと思う。今後も、このページに追加して行くつもり。


ImageJを多重起動させない方法

Windowsでは、jpgなどのファイルをダブルクリックすると特定のアプリが開くように設定できる。やり方は画像を右クリックして、プログラムから開くを選択して、ImageJを使うように設定する。しかし、やや問題が出てしまう。画像をクリックするたびにImageJが新規で起動してしまうのだ。通常のの使い方では、ImageJのアプリはひとつ起動すれば十分のはず。そこでImageJを複数起動させないように設定してみる。
Edit > Options > Misc...
下のMiscellaneous Optionsパネルが開く。
Run single instance listener にチェックを入れれば、画像を複数ダブルクリックしてもImageJが多重起動することなく、1回だけになる。



PNG/GIF透明色の設定

PNGやGIFファイルは使っている色のうち、任意の1色を透明にすることができる。例えばこんな数式を画像で表示する場合、数字以外の背景を透明にしている。画像としては背景は白色なのだけど、白を透明に設定することでこのように表示できる。
ではImageJでこれを実現する方法を紹介する。
まず画像を Image > Type > 8-bit Color で8ビットカラーに変更する。そのときパネルが出てくるので、数値を入力して必要な色数に落とす。2-256色まで自由に設定できる。
次に画像をカーソルでなでると、下のようにパネルに index= が表示される。
このindexは2-256色のどれか(indexでは0~255だと思われる)なので、ここで透明にしたい色は index の何番なのかを確認しておく。
次に、Edit > Options > Input/Output...
を選択すると下のパネルが表示される。
パネルの GIF and PNG transparent index: は-1になっていると思われるので、これを透明にしたい任意のindex番号に変更する。その上で、PNGやGIFに保存すると、透明が反映される。



簡単なマクロ

マクロは同じ作業を繰り返すときに威力を発揮する。マクロはスクリプト言語で、ImageJ Macro Language (IML)。つまり独自なもの。はじめJavaScriptかと思った・・・ リファレンスガイドもちゃんとあるので、それを読めばマクロを自由に組める。実はあまりマクロは使いこなしていないのだが、数十枚もの画像を一気に縮小させるときに以下のようなマクロを使っている。

マクロの作り方は簡単でメモ帳に下のような内容で書いて普通にtxtで保存する。ファイル名は何でも構わないみたい。そして保存する場所もどこでもよい。これがマクロファイルになる。それをImageJにドロップして開く。マクロとして開かれるので、そのメニューの Macros > Run Macro で実行して処理する。

下のマクロは、ImageJで開いている画像を、すべて同一サイズに縮小するマクロ。内容は Size...というコマンドで縮小させている。縮小方法は画質がよいとされているBicubic。さらにこれだけだと絵がボケるので、Unsharp Mask...も兼用している。そしてfor文で開いている画像すべてに適用されるというマクロ。手作業で1枚1枚やることを考えたら楽になる。
macro "Size & Unsharp Mask" {
 w = 300;
 h = 225;
  for (i=1; i<=nImages; i++) {
   selectImage(i);
    run("Size...", " width=w eight=h 
           constrain average interpolation=Bicubic");
    run("Unsharp Mask...", " radius=0.7  mask=0.60");
  }
}


2012.4.29

ドラッグ&ドロップで複数ファイル連続縮小 プラグイン&マクロ

たくさんの画像ファイルを同じ大きさに縮小したいことがよくある。「縮小専用」とか「藤 Resizer」等の専用ソフトもあるが、普段よく使うImageJでも同じような処理を実現させたい。プラグインを自作すれば可能だけど、ImageJのAPIから理解する必要があって、やや敷居が高い。そこで既存プラグインで使えそうなものをピックアップして、マクロを組合わせて実現してみた。
使うプラグインは、「Droplet」 というもの。これは複数ファイルをDropletのパネルにドラッグ&ドロップすると、マクロ処理を連続して実行してくれる。
http://imagejdocu.tudor.lu/doku.php?id=plugin:utilities:droplet:start
新たなプラグインをImageJで利用するには、ダウンロードしたjarもしくはclassファイルをImageJのpluginsフォルダの中に入れて、ImageJを再起動すれば、メニューのPluginsに表示される。それを選択すれば実行され、以下のようなパネルが表示される。
パネルにあるリストがマクロのファイル名で自由に増やしていける。「...」のボタンを押すと、選択しているマクロファイルが開かれる。 このマクロファイルは plugins/Droplet Actions/ の中に入っている。拡張子はijm。今回実現したい連続縮小させるには、そのマクロだけ新規に作ればよい。複数ファイルをドラッグ&ドロップすると、画像を開いて、縮小処理して、jpgファイルで別名に保存して閉じる。を繰り返す。保存先は同じディレクトリにしてみた。

縮小用マクロ
w = 300;
h = 300;
path = getArgument();
open(path);
run("Size...", " width=w eight=h 
       constrain average interpolation=Bicubic");
run("Unsharp Mask...", " radius=0.7  mask=0.60");
directory = getInfo("image.directory");
macro "Save As JPEG... [j]" {
     quality = 92;
     saveAs("Jpeg" , directory + "resize_" + getTitle);
     close();
     }
薄字の部分は、

  • 縮小したいサイズ(ピクセル)

  • 保存するjpgの品質。これは100が最高画質だが圧縮率が低くなる。

  • 別名で保存のファイル名。上記はファイル名の先頭に加える文字になる。

  • これで「縮小専用」に近い使い勝手を実現できた。問題は大きなファイルを扱うと、いちいちファイルを表示してから処理するため動作が遅くなること。メモリに読み込むだけで処理を完了させたいところだが、お手軽マクロでは実現は難しそう。処理速度を向上させるにはプラグインを作るしかないかな。