Re - ImageJで学ぶ!: 2015-12-13

2015年12月14日月曜日

第64回 ImageJのプログラムエディタで学ぶ!

今回は、ImageJでプログラムを書く場合の便利なエディタの機能について紹介します!

ImageJのプログラムエディタについて


ImageJはオープンソースソフトウェアであるため、ImageJそのものをユーザの思い通りに改変して利用することができます(ライセンス条項に則って)。
このような改変を行うために統合開発環境(Integrated Development Environment:IDE)というソフトウェアを用いて本腰を入れて開発を行うこともできます。この方法については、第42回 ImageJのソースコード分解(Eclipseを用いたImageJのプラグイン実行方法)で学ぶ!を参照してください。

今回は、このようなIDEを用いず、プラグインやマクロを作成する場合に使うImageJのエディタを、このエディタを強化すツールであるjEditをImageJビルトインする方法(「IJ_Ed advanced editor for ImageJ」)も含めて、紹介していきます。


ImageJのjEditエディタの実装


まず、jEditはマルチオペレーティングシステム対応のフリーのプログラムエディタです。主な特徴は以下のとおりです。
  • シンタックスハイライト
  • ソースコードのオートインデントやプログラム解析
  • 検索・置換
  • ファイルマネジメント(文字エンコード)
  • 機能のカスタマイズや拡張
ImageJでjEditを使うには、次のWebサイトからダウンロードして、ImageJのプラグインフォルダに解凍します。

・jEditダウンロード
http://www.jedit.org/index.php?page=download
IJ Ed2 ImageJプラグインダウンロード
http://imagejdocu.tudor.lu/doku.php?id=plugin:utilities:ij_ed:start

上記が完了したら、インストール完了です。


jEditを使ってマクロを起動させてみよう


まず、jEditを起動します。



次に、ImageJを起動して、ImageJのプラグインのリストから<plugins>Editor>IJ Ed2 jEdit link>を選択して起動してみましょう。ImageJを起動している場合は、そのままプラグインを起動しましょう。
起動画面です。
早速、簡単なマクロを動かしてみましょう。最初は、"Hello"ダイアログを表示してみます。jEditの新規テキストに、次のように書いてみます。

showMessage("Hello Re-ImageJ Readers!");

そして、プラグインのウィンドウ内の"Run macro"から実行してみましょう。
次のようにポップアップが表示されます。


もう一つ、同じ画面上で2つマクロを編集してみます。一つは上記のマクロで、もう一つマクロを増やします。
jEditの新規テキストボタンを押して、新規テキストを作成して、レイアウトを2パネルに変更します(jEditウィンドウの右上)。

新しいテキストには、次のようにサンプル画像を指定して表示するマクロを書いてみました。

run ("Blobs (25K)");

編集しているjEdit上のテキストをアクティブにしたまま、同じように、プラグインウィンドウの"Run macro"を押して、マクロを実行します。




上記操作は、開発者が動画でも公開しているので、チェックしてみて下さい。


(Introduced by:https://www.youtube.com/watch?v=sLvXBBGGsBs)


このような操作の他に、このプラグインでは、"Install macro"で編集しているマクロをImageJにインストールしたり、編集しているテキストファイルがjavaファイルの場合は、”Compile java”でクラスファイルにコンパイルしたりできます。

jEditのデフォルトのメニューからマクロのテキストファイルを読み込んで編集することもできます。もちろん、jEditは主にプログラム用のエディタなので、ゼロからプログラムを作成することもできます。

今回は、ImageJを用いたプログラム開発のためにjEditを用いる方法を紹介しました。ImageJ標準のエディタを使うよりも、jEditなどのプログラム開発専用のエディタを使うほうがプラグインやマクロを開発しやすいと思う人が多いはずです。
jEditは、開発環境として、IDEには敵わないと個人的には思いますが、ちょっとしたマクロを書きたいときには便利です。普段からImageJを自分でアレンジして使っている方々にとって有益な情報になれば幸いです。


参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(26・2) 2011, p96-97」

2015年12月13日日曜日

第63回 ImageJによる領域抽出の応用ーFijiとレベルセット法で学ぶ!

ImageJでは、画像濃淡値の閾値による領域抽出が標準で用意されていますが、今回は、最先端かつ応用的なレベルセット法という領域抽出法を紹介します。画像の中の対象周辺の濃度勾配の計算を繰り返しながら正確に輪郭を抽出する手法です。


領域抽出手法について


ImageJで実行可能な領域抽出法については、これまでにいくつか基礎的な方法に限り説明を行ってきました。今回は、ImageJを生命科学の研究用に特化させた"Fiji"を使って、より応用的な輪郭抽出法の説明を行います。
Fijiについては、第51回ImageJの高次画像処理パッケージーFijiについてーで学ぶ!を参照してください。

Fijiで扱うことができる領域抽出法は多く揃っています。以下に、主な領域抽出法を紹介します。
  • 自動局所閾値処理
  • マルチ大津法
  • 最大エントロピー閾値法
  • 混合モデリング閾値法
  • Nuclei Watershed Separation法
  • SIOX:Simple Interactive Object Extraction
  • レベルセット法
それぞれの画像の領域抽出法には長所・短所があるため、目的に応じて使い分ける必要があり、この手法自体に優劣をつけて評価できるものではないことに留意してください。
2015年12月現在、Fijiのプラグインに設定されているSegmentationツールは次の通りです。
(各機能の詳細はFijiサイトで確認してください。)

レベルセット法による領域抽出法


レベルセット法は、オブジェクトの境界を抽出するために、濃淡の高低差のある位置を認識し、隣接するピクセル間の差分の評価を偏微分方程式(partial differential equations :PDE)をベースに解いていく手法です。

抽出領域が成長している間は、常に新しく追加されたピクセルに現在の選択範囲の差を計算し、事前に選択された濃淡値の差を越える場合、または、それが事前に選択された成長の特定レートを超えている場合は、成長が止まります。
しかし、このアルゴリズムは、オブジェクトの外側に領域が漏洩する可能性もあります。

輪郭がオブジェクトの境界に到達するまでのレベルは、ゴムバンドの強さとグレーレベルの違いを事前にレベルセット設定ダイアログから選択して調整できます。
この設定の中にあるスピーディーファーストマーチングは、処理データが大きい場合に、高速なレベルセットによる輪郭抽出として使用できます。例えば、画像が大きければ、スピーディーファーストマーチングでスタートして、レベルセット法でオブジェクトを定義し、輪郭抽出を使用することで、オブジェクト検出の効率化を図ることができます。


Fijiによるレベルセット法のアルゴリズムの詳細


レベルセット法の高速マーチングアルゴリズム(Flood fillに似ている処理方法)はオブジェクトの境界に向かってシード点から展開されていきます。アクティブな輪郭は、画像の複数の固有の幾何学的測定に準じて、特定時間内に初期輪郭を進化させます。

Fijiに実装されたプラグインで測定されるのは、エッジベースの制約、グレー値ペナルティ、あいまいなエッジにおけるオブジェクト境界漏れを防ぐ局率制約です。

Fijiのプラグインは偏微分方程式を用いた図に示す式に基づいています。


(補足)

  • Φ(i)=最新の抽出表面
  • W(a)=移流重量
  • F(a)=移流力
  • W(c)=曲率重量
  • F(c)=曲率力
  • ∇I*=ガウシアンぼかし画像間の差分



Fijiを用いたレベルセット法の実行例


レベルセット法はFijiのプラグインから選択できます。
まず、対象とする画像を表示して、ポイントアイコン(またはポリゴンや円形ROI)を選択し、領域抽出したシードポイントを決定します。次に、FijiメニューからPlugin>Segmentation>Level Setsを選択すると、図のようなダイアログが表れます。
一般的なものであれば、デフォルトの設定でうまく抽出できるようになっています。



シード点にポイントツールを利用している場合は、"Use Fast Marching"をチェックすると、高速に輪郭を探してくれます。また、ある程度マニュアルで任意ROIによって形状を作ってから"Use Level Sets"をチェックして実行すると、ROIをうまく対象画像の辺縁にマッチしてくれます。"Use Level Sets"はデフォルトでOnになっています。

上記設定で、そのままOKをすると、領域抽出が繰り返され、設定された閾値領域がすべて抽出されると、自動で計算が止まり、ROIと二値化画像を表示してくれます。


(抽出結果:濃淡値の閾値"50")

この例では、脳腫瘍が他の脈管や白質・灰白質などの正常組織とコントラストが淡く、デフォルト設定ではうまく抽出されませんでした。造影コントラストのある脈管系を除く脳全体が抽出されたことがわかります。

そのため、境界条件をもう少し厳しくして、再度、計算させてみると、次のように、画像内の脳腫瘍と同じ濃淡レベルの領域が複数抽出されました。


(濃淡値の閾値を"50"→"10"に設定)



(実行結果)

同じような目的で利用する領域抽出処理にSnake処理がありますが、利用する上で大きく違うポイントは、レベルセットでは、このように複数の関心領域を同時に分けて検出してくれるところです。

また、上記の例では、外側に膨張していく処理ですが、Region expand設定をInsideにすれば、内側に膨張させていくことも可能です。

このように、レベルセット法はImageJのデフォルトの領域ツールとは異なり、シードポイントを拡張しながら対象物の輪郭を抽出したり、同様に対象物の周辺から輪郭に向かって縮小していくような微分方程式を用いた優れた領域抽出法です。

今回は、画像の領域抽出処理の中でもレベルセット法による輪郭抽出について説明を行いました。本処理は、特に、腫瘍の面積を正確に計算したり、複雑な輪郭形状を抽出するのに便利な領域抽出法です。

次回もImageJによる画像処理の応用について説明を行います。


参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(26・1) 2011, p86-87」