Re - ImageJで学ぶ!: 2015-09-27

2015年10月3日土曜日

第32回 ImageJによる領域抽出処理で学ぶ!

画像の領域抽出処理は、2値化あるいは2値画像処理と関連して頻繁に使用される画像処理です。画像内の特定の対象(臓器、組織、細胞、特定の病巣、特定の色を持つ領域など)をこの領域抽出処理によって取り出し、各種統計解析処理や特徴量の解析などにつなげるためにも精度の高い自動抽出機能が望まれます。

lmageJでも代表的な領域抽出法がいくつか紹介されていますが、その中でもユニークな動的輪郭モデル(スネーク)による領域抽出法を紹介します! 

閾値処理による領域抽出法


最も簡単な領域抽出法として、単に2値化する際に用いる閾値抽出法が挙げられます。これは、ImageJで標準機能として用いることができます。(ImageJによる2値化については、第23〜25回で詳述してきました。)
ヒストグラムにあきらかな山と谷がある場合は、「大津の方法」と呼ばれるヒストグラム法などで、画像内の特別な値を持つ対象のみを抽出できます。

次の図は、この方法をlmageJで試みた例です。
(元画像)
(2値化)

図のように、画像の背景や対象の濃淡値が不均一の場合や、対象としたい領域と似ている別の領域がある場合には、工夫しなければ、使用するのが困難であることがわかります(赤い部分が抽出処理によって認識された部分で、思ったところを完全には抽出できていないことがわかります)。

このような閾値抽出の失敗をカバーするために、ヒステリシス(Hysteresis)閾値処理が使用される場合があります。
この処理は、閾値に一定の幅を持たせ、閾値以下の画素であっても閾値以上の濃度値を持つ画素の近隣に位置するものであれば抽出する方法です。別名、Connection Thresholding」とも呼ばれています。こちらからプラグインをダウンロードしましょう。
http://imagejdocu.tudor.lu/doku.php?id=plugin:segmentation:thresholding_by_connection:start
利用するためには、説明に沿って、2つのクラスファイルを、pluginsフォルダ直下に保存して、ImageJを起動します。
次の図に、ImageJによるヒステリシス閾値処理例を示します。
(プラグイン起動)
(SetでデフォルトのままOKして、閾値別の領域ごとに3色表示)
(近傍の抽出領域の濃淡値を変えてマルチ二値化)

(近傍の領域を含めてまるまる二値化=ヒステリシス二値化)


本質的には、この処理の結果は単純な大津の方法とあまり変わりません。
この処理のアルゴリズムの詳細は、ImageJのドキュメンテーショWiki(http://imagejdocu.tudor. lu/imagej-documentation-wiki/plugins)紹介されています

また、マルチ大津法というlmageJのプラグイン(http://rsbweb.nih.gov/ij/plugins/download/Multi_OtsuThreshold.java) も紹介されています。結果は、上記のヒステリシス閾値処理と類似しているため割愛します。

これら閾値による領域抽出法では、記のように完全自動で抽出するのが困難な場合が少なくありません。このため、扱う画像の性質により、あらかじめ前処理を施して使用することになります。例えば、あらかじめ対象の抽出のために、グレイスケールレベルでオープニング処理を施して、対象以外の余計な対象をすべて除去し、その後、大津の方法を使用して抽出するなどの方法が必要になります。

このように、自動領域抽出といっても、実際は画像の性質に応じて何らかの前処理が必要な場合が多いということになります。

動的輪郭抽出処理


画像上の対象が何らかの輪郭を持ち、エッジが観察できる場合、そのエッジを閉曲線として抽出する処理を動的輪郭抽出処理と言い、一般的には「スネー (snakes)」と呼ばれています(参考文献1)

次の図は、Dr. Thomas Boudier によって作成されスネークプラグインhttp://rsb.info.nih.gov/ij/plugins/snake.html)の施行結果です。操作手順として、前述のImageJのドキュメンテーションWikiからSnake_.classファイルとPoint2d.class をダウンロードし、pluginsにファイルを置きます。

実際の操作手順は、下記の通りです。
検出したい部分の周辺をROIで囲む(任意のROIでよい)
プラグインから(Snake)を起動
各種設定をしてから、実行。


(Snakeプラグインの実行結果:繰り返しは1回)

さらに、このSnakeプラグインの改良版に「ABSnake2」が公開されています(http://imagejdocu.tudor.lu/doku.php?id=plugin:segmentation:active_contour:start)。

こちらも同じようにプラグインをセットして利用できます。違いは、繰り返し計算ごとのROIや位置情報テキストを保存できるようになったことなど、マナーチェンジが行われています。


  1. まず、前述同様、任意のROIを、関心領域内におさまるように配置(エッジ強調などをして、領域確認するといいかもしれません。)
  2. 設定したROIからエッジを検出していくための閾値(Gradient threshold)を設定( 大きな値はよりスムーズな曲線になります) 
  3. 繰り返し数を設定
を行って、以下の設定を任意に行います。

  • 繰り返しごとの画像を保存するチェック
  • 繰り返しごとのROI位置情報をテキスト保存するチェック(coordinates)
  • セグメント領域の二値化画像の生成チェック(うまく動作しないことがあります)
  • 繰り返しごとのROI情報を保存するチェック
  • ROIのサイズを記録するチェック
  • テキスト、画像、ROIを保存する場所の指定
スタック画像の場合は、最初のスライスの設定が次のスライスに反映されます。 

この処理を肺がん例に適用した例が次の図です。


(ROI設定)

(ABSnake設定画面:繰り返し数は、数百などの大きい値にした方が、きれいに抽出されます。)

(抽出結果)

(自動保存されたデータ)


肺がんの関心領域が、スネークインターフェイスのパラメータに従って抽出できていることが観察できます。スネークは、一般的になめらかな輪郭線の場合は精度良く抽出できますが、複雑な形状の場合はパラメータ調整も複雑になります。

スネークアルゴリズムの解説


スネーク処理をする場合、最初に画像上の対象に対して、大雑把な閉曲線を作るのが一般的な手法です。この閉曲線のエネルギーEsは次式で与えられます

(参考記事より引用)

このEsが最小値になるように閉曲線を求めます
ここでv(s)は、s(0s1)媒介変数とする閉曲線です。一般的にv(s)は、二次元閉局面を示すので、v(s)= (x(s),y(s))と表されます。

(1)Einternalは、閉曲線の連続性のなめらかさを表すエネルギー、Eimageは画像のエッジの強さに基づくエネルギー、Eexternalは、閉曲線を縮小させるためのエネルギーを意味します。

さらにEinternalは、連続性のエネルギー EcontinuityとなめらかさのエネルギーEcurvatureの荷重和です。
この連続性のエネルギーは、次の式で表すことができます。

(参考記事より引用)

これは、v(s)の一次微分値の2乗です。また、なめらかさのエネルギーは、次の式で表されます。

(参考記事より引用)

これはv(s)の二次微分値の2乗です。
上記の荷重和の荷重係数は、対象に応じて調整するのが一般的手法です
Eimageのさらに詳細な式として、次の式が与えられます。


(参考記事より引用)

この式はv(s)の位置での画像値の勾配を示しています。ここで閉曲線v(s)は、デジタル画像では離散的な点であり、点列の間はスプライン補間などが施行されます。

この点列は、エネルギーが小さくなる方向へ、指定された画素近傍から順次移動していきます。ほとんどのスネークアルゴリズムが上記の処理の変形です。

今回は、ImageJを用いた画像の中の対象を抽出する処理の説明を行いました。この処理は、三次元画像処理でも応用されており、取り出された対象の体積や三次元形状指標などが計算されて、診断のための定量化がなされています次回は続けて、画像の要素の検出方法について述べます!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(22・11) 2007, p105-107」
  • 1) Kass, M., Witkin, A., Terzopoulos, D. : Snakes : Active Contour Models”. IJCV, 321-331,1988. 
  • 2) T. Boudier, Elaboration d'un modèle de déformation pour la détection de contours aux formes complexes, Innov. Techn. Biol. Med., Vol 18, n°1, 1997.

2015年10月2日金曜日

第31回 テンプレートマッチングによる医用画像処理で学ぶ!

今回は、lmageJを用いた画像のパターンの検出法としてのテンプレートマッチングについて解説します。

医用画像への適応では、放射線治療計画や異なるシリーズ間の画像位置合わせ、DSAや胸部X線画像の時系列サブトラクションなどのマスクとライブ画像の精度評価などに使用されることがあります。

lmageJを用いたテンプレートマッチングは、ロチェスター大学のウォルター・オデル博士(Walter O’Dell Ph.D.)や以前もご紹介したことのあるQingzong博士のプラグイン(https://sites.google.com/site/qingzongtseng/template-matching-ij-plugin)が公開されています。

テンプレートマッチングとは


2つの画像が同じかどうかを判断するために、画像を重ね合わせて違いを調べる様な画像処理を、一般的にマッチングと称します。
また、画像の視覚的特徴や画素値そのものをパターンと言い、そのパターンの存在や位置を検出することをパターンマッチングと言います。標準のパターンをあらかじめテンプレートとして用意しておき、テンプレートと入力画像とのマッチングを行うことをテンプレートマッチングと言います

テンプレートマッチングにおける定量評価指標


2つの画像間の整合性を定量的に評価する指標として代表的なものが、類似度または相違度と呼ばれ、SSD(sum of square difference:差の2乗和)SA (sum of absolute difference:差の絶対値和)などがあります。計算式は以下のとおりです。

(参考記事より引用)

ここでテンプレートの大きさをM×N、位置(i,j)における画素値をT(i,j)、ンプレートと重ね合わせた対象画像の画素値をI(i, j)とします。これらの値が0に近いほど、2つの画像の類似性が高いと言えます。

テンプレートは、対象画像上をラスタースキャンしながら移動するため、SSDSADの値は鳥轍図などで示すとよりマッチング精度が高くなり、位置を同定しやすくなります。また、類似度として相互相関値であるNCC(normalized cross correlation)が利用される場合がありますが、これは2画像間のベクトルのなす余弦(cos)と同等であり、次式によっ て表されます。

(参考記事より引用)

ここで、ITの領域内の画素平均値を求め、2画像間の相互相関係数によって類似度を判断することもあります。

(参考記事より引用)

相互相関係数は(4)、(5)を用いて、次式で表されます。 

(参考記事より引用)

この値は、テンプレートと対象画像が完全に一致している場合に「1」となります。

ImageJによるテンプレートマッチング処理

最初に説明しましたが、
ォルター・オデル博士によって、ンプレートマッチングのためのプラグインが紹介されています(http://rsb.info.nih.gov/ij/plugins/template-matching.html)

このプラグインは、あらかじめ画像や形状図形などのテンプレートを作成し、次に、対象となる画像に関してテンプレートと一致する位置を探索することが可能です

このプラグインで用いている類似度は、上述の正規化された相互相関係数 (NCCC:normalized cross-correlation coefficient)を計算します。

よって、テンプレートと対象画像の完全な一致は+1あり、濃淡値だけが2画像間でまったく逆の場合は-1となり、完全に無関係なテンプレートであれば0となります。

次の図は、ImageJWebサイトからダウンロードした当該プラグインを実行したときのGUI表示例です。Create Circular Templateボタンは、対象画像が細胞のような丸い画像の場合に円形テンプレートを作成し、サイズを変化させてマッチングし、同じ大きさの円形対象を自動的に選んでくれます。


テンプレート処理手順は、まず、テンプレートにしたい画像(例えば、あらかじめ解析対象画像の一部の関心領域をDuplicateして保存しておくなど)を作成しておき、対象となる画像を読み込み、本プラグインを起動します。

それから、プラグインGUI上のLoad Template from Fileボタンを押して、あらかじめ作成しておいたテンプレートを読み込み、表示します。

Perform Statistical Correlation を押すと、表示されている2画像間のNCCCの計算が行われ、その後、相関画像が表示されます。

この相関画像の各ピクセルに割り当てられた濃淡値は、そのピクセル位置に関して中心にあるテンプレートイメージで計算されたNCCC値を示しています。

set threshold&get particle analyzer results ボタンを押すと、粒子や細胞カウンターなどの粒子アナライザの結果を表示します。

Doneで実行すると、Resultテーブルに相関係数の高いものからアノテーションのリストが表示されるはずです。

しかし、今回は、Qingzong博士のプラグインも試していきます!
Qingzong博士のプラグインはOpenCVのJavaのラッパーを利用できます。そして、テンプレートマッチングに計算する相関係数も豊富です。

まずインストールは、サイトの指示に従って、以下のjarファイルをダウンロードして、全部pluginsフォルダに入れます。
  • Template_Matching.jar
  • javacpp.jar
  • javacv.jar
  • opencv.jar
  • opencv-macosx-x86_64.jar(ユーザの利用環境に合わせる)

あとは、またテンプレート用画像を用意しておきます。
例えば、

(差し替え中)
(テンプレート画像)

(差し替え中)
(マッチングする画像を読み込んでおきます。)

Pluginsから、Tempalte_Matching>cvMatch_Template...を起動します。

(起動画面)

(相関係数を選択します)

そのまま実行してみましょう。

(差し替え中)
(実行結果)
※ここで、空かさずAnalyze>Tools>ROI managerでAddしておいてください。


(差し替え中)
(相関係数に濃淡値を置き換えた画像:自動で作成される)

この相関係数画像に、保存したアノテーションを当てて、Measureしてみます。
(1が計算されたもの、2と3は、ランダムに画像内に配置した四角ROIをMeasureした結果)

この結果から、最初に計算した領域で、相関係数が1になる領域があったことがわかります。その他の領域では、Maxがこれに及んでいないことがわかります。

今回のテンプレートとテスト画像では、相関係数を別のものに変えても、すべてきれいにマッチングされました。ただ、これがもう少し画質に差があるもので試すと、おそらく、デフォルト設定になっている、NCC係数でのマッチングが一番再現性が高いと思われます。(経験則です。)

より詳しいチュートリアルは、こちら。(https://sites.google.com/site/qingzongtseng/template-matching-ij-plugin/tuto1)

mTSSなど、シビアな関節の寛解評価に、このような係数がイメージングバイオマーカーとして利用できそうなので、今、開発しています。


今回は、パターンの検出手法であるテンプレートマッチングについて説明を行いました。

次回も引き続き画像処理や解析法を紹介します!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(21・9) 2007, p114-115」


2015年10月1日木曜日

第30回 連続画像処理 ImageJ-VTK(The Visualization ToolKit)の活用で学ぶ!

lmageJに三次元可視化ライブラリをプラグインとして実装しようとするプロジェクトは、いくつかのWebサイトでも紹介されています。
その中でも、特に科学研究用の三次元可視化ライブラリとして世界的に使用頻度が高く、クラス群が充実しているのが 「VTK(The Visualization Toolkit)」です。

VTKは単なる三次元可視化だけのライブラリではなく、さまざまな科学的解決のための豊富なアルゴリズムがパッケージ化されています。最近では、オープンソースの高速・高機能三次元ワークステーションとして有名になったMacOSX専用DICOMビューワ「OsiriX」にも、このVTKの機能が多く搭載されています。

今回は、lmageJによるVTKのコントロールの一例を紹介しながら、三次元可視化について解説します!

VTKについて


ImageJにおける三次元画像処理の基本的な操作方法やlmageJマクロ言語を用いた三次元アニメーションの制御などは、本連載の第26回や第28回で触れてきました。

VTKは、ImageJでコントロールできる三次元画像処理やプログラム制御できるさまざまな画像解析機能を、可視化という分野で比較すると、その機能ははるかに上回っています。このVTKがJava言語でコントロールできれば、これをImageJに実装して、強力な2D/3Dパッケージソフトウエア化しようという試みは、オープンソースブームの流れからするとごく自然な成り行きです。

VTKは、オープンソースとして自由に利用されている多言語ライブラリであり、C++クラスライブラリやそのラッパーとしてTcl/TK(ティクルティーケー)、PythonおよびJavaなどでもコントロールでき、その本体は開発・提供元のKitware社のWebサイト(http://www.vtk.org/download/)から 無償でダウンロードできます。

スカラー、ベクトル、テンソル、テクスチャ処理などのボリューメトリックな手法から、ポリゴン削減処理、メッシュ平滑化、カッティング、コンツーリング、ドローネ三角分割法などの先進的なモデリングの手法まで、多様な処理をサポートしています。

二次元および三次元グラフィックスアルゴリズムの両面から、さまざまな画像処理アルゴリズムが利用できます。これらのアルゴリズムは、オブジェクト指向に基づいており、Windows、MacOSX、Linuxなど、主要OSに対応したマルチ・プラットフォーム・ライブラリとなっています。

VTKの一般的な使用方法について


VTKを使い始めるためには、VTKのライブラリをインストールしなけれなりません。2015/10現在の最新バージョンは6.3.0です。

インストールには幾つかのアプローチがあります。

①最新のリリースバージョンをダウンロードする。
②Kitware社から販売されているVTKテキストブックを購入し、その中のメディアからインストールする。
③バージョン管理サーバから直接ソースコードを入手して、コンパイルして利用する。

オススメは、①の手法です。

各OSでインストール手順は異なります。WindowsかLinuxは、このブログを書いている今は、Pythonベースのインストーラが用意されているので、ダウンロードしたインストーラを実行するだけです。Macは、もう少し手間がかかります。筆者は、Macユーザですが、今回はちょっと時間の関係でWindowsでの操作例で示していきます。

VTKのインストールは、Windowsならインストーラをダブルクリックして、指示の通り進めていくだけでインストールが完了します。

インストール以降の詳細は、VTKのWebページやVTKのテキストブックに譲って、ImageJへの実装へ話を進めます。

ImageJプラグインによるVTKのコントロール


ImageJのプラグイン提供者JerekSacha氏が自身のWebサイト(http://ij-plugins.sourceforge.net/)で、java言語による世界的に定評のある画像処理や三次元可視化ライブラリをlmageJへ実装するプラグインを紹介しています。

汎用の画像処理ライブラリとして、Oracle社(サンマイクロシステムズを吸収合併した会社)が提供しているJavaベースの画像処理ツール“JavaAdvanced Imaging(JAI)”やJAI用のAPI“JAI Image I/0”もlmageJプラグインとして当サイトからダウンロードできます。

ライセンス形態は、GNU LibraryまたはLesser General Public Licens(LGPL)とされていますので、無償でソースコードが使用できます。

これらのプラグインの最新版は、2015/10現在、Java1.7以降が必要ですので、Javaのバージョンに注意しましょう。もしバージョンが低い場合には、必要に応じてOracle社のダウンロードページからダウンロードしてください。

本稿では、Javaのバージョンの関係で、ij-plugins_toolkit_bin_1.5.0を利用していきます。

VTKをlmageJに実装するには、まず、当サイトから以下の3つをダウンロードします。


  • “VTK-5.0.x”(本稿執筆時点で、VTK-5.0.3)
  • “ij-pluginToolkit v.1.5.0”
  • “ij-VTK”


これらの3つのファイルを、すべてPlugins直下にコピーしましょう。

このうち、VTK-5.0.3フォルダ内に、丁寧にバイナリファイルとしてコンパイルずみのダイナミック・リンク・ライブラリ(VTK-5.0.3内のvtk.jar:Javaのラッパー)が提供されているので、このディレクトリに対して環境変数のパス("C:¥Program Files¥ImageJ¥Plugins¥VTK-5.0.3"など)を通すと、無事にVTKが起動します。環境変数の設定は、第二回のImageJインストール編で説明しています。

うまくインストールできると、Plugins>VTK>VTK versionをエラーメッセージなく表示できます。


このプラグインは、8bitグレースケールで処理していきます。(PCのスペックに応じて、調整可能かもしれません。)
まず、スタックをインポートしてから、8bitグレースケールにします。


それでは、早速、VTKプラグインの中の〈SurfaceRendering(VTK)〉を選択し、実行してみます。


微妙です。すみません、久々のWindowsPCで、スペックも低いので、すぐフリーズしてしまうPCと格闘しながら、なんとなくオパシティカーブを変えて、Applyして表示しています。

使ってみたことのある方はわかると思いますが、GUIの操作はもっと改良されていくと思いますので、あしからず。

しかし、ImageJのプラグインでも、VTKのポテンシャルを生かすことのできる可能性を垣間見えました。
他にも、すでに、Volume Viewerなどの優れたImageJプラグインがありますが、市販のワークステーションのように、自分の思うがままに、VTKを使ってインタラクティブな三次元画像を操作するインターフェイスを動作させたい方、このプラグインの拡張をご検討されてみてはいかがでしょうか。

画像処理の改良が進むことが期待できます!
次回も続けて連続画像の解析について説明します!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(21・8) 2006, p57-59」