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」

2015年9月30日水曜日

第29回 連続画像処理 ImageJオープンソースネットワーク環境を用いた複数画像処理で学ぶ!

近年の急速な医用デジタル診断および治療システムの普及により、臨床現場で発生する医用画像は膨大な量となっており、病院や診療施設の運営上でも重要な課題として論議されています。このような中で、医用画像処理やバイオイメージングによる解析も、いまや、単一の医用画像を単一のコンピュータで処理していた時代ではなくなり、膨大なデータを高速に処理するためのシステムアーキテクチャに基づいて運用されつつあります。クラウドなどの外部保存もその一つです。
このような背景で、医用画像を保管・データベース管理・送受信するPACS(picture archiving and communication system)の需要は必然のものとして認識されつつあり、すでに、その普及率は、中規模病院では7割を超える勢いの導入率が報告され、新規設立クリニックでは、ほぼ100%、PACSが導入されています。
このような普及が進むにつれて、次なる課題は、ベンダーニュートラルアーカイブとも言われています。
話を戻して、このPACSは、DICOM規格によるネットワーク通信用のソフトウエアを組み合わせたソフトウェア群から構成されることが多いのですが、これらのソフトウェアは、オープンソース(無償提供かつソースコードが公開されているもの)でも品質は高くなり、動作も安定化してきました。

今回は、lmageJプラグインであるオープンソースのPACSライブラリを用いたDICOM画像通信および処理について解説を行います。

オープンソースDICOMツールキットについて


DICOM画像をネットワーク上で効率的に運用するためにDICOM規格というものが決められています。その機能はサービスクラスという名称で特徴づけられています。
ImageJでの操作上、この中で特に必要とされるサービスクラスの機能として以下のようなものが挙げらます。

①CR/DR、CT、MRI、US、PET、SPECTおよびDR、放射線治療装置などの装置からダイレクトにImageJに送信し、その画像をImageJで表示/処理する。
②lmageJで処理した画像(DICOMフォーマット)を別の端末に送信し、その画像を他のDICOMビューワのデータベースに自動登録し、表示/処理する。
③DICOMサーバや別の端末のDICOMビューワにストアされている患者データベース情報を、ImageJ端末から参照(クエリ)し、その中から必要なデータを受け取って(リトリーブ)、 ImageJでその画像および画像群を表示/処理する(QR機能)。
④病院や診療所で配布しているDICOMビューワ機能付きのCDやDVDの中にあるDICOMDIR(患者検査情報・撮像プロトコール・画像などをディレクトリ構造にしたDICOM規格によって定められたファイル)を参照して、データベース化し、ImageJでダイレクトに取り込む機能
⑤匿名化したいDICOMタグを選び、自動で希望する変更名で送受信する機能(匿名化送受信機能)

上記の機能が、基本的なDICOM通信およびデータベース機能です。


有名なサンプルコード


1994年にワシントン大学のマリンクロット放射線学研究所(Electronic Radiology Laboratory)で開発された中央試験ノード(Central Test Node:CTN)用コードというものがあります。

このレジェンドなソフトウェアは、DICOM装置の相互接続デモ用に開発され、パブリックドメイン(無償公開ソフト)として配布されたのをきっかけに、その改良版が世界中に普及しました。

しかし、ImageJとの相性を考えてみると、このCTNはC言語で開発されていることから、Java言語で開発されているImageJに実装することは容易ではありません。このような機能を提供するJava言語のライブラリとして、「dcm4che」があります。

今回は、このdcm4cheで開発されたオープンソースであるTudor DICOM toolsを使って、DICOM通信をテストしていきます。


ImageJ Tudor DICOM Plugins


Tudor DICOM PIugin(http://www.santec.lu/project/dicom/download)を実装するに当たり、インストール方法に沿って、zipファイルをダウンロードして、plugins/TudorDICOMLibsおよびplugins/TudorDICOM_Plugin.jarの配置でコピーする必要があります。

追記(2015/12/22);すでにImageJにFigureJというプラグインがインストールされている場合、"loci_tools.jar"が含まれているので、重複エラーが出て、TudorDICOMLibs内の同jarファイルが削除されて、プラグインを起動できなくなるので、あらかじめ、FigureJが入っている場合には、これを除いてから、インストールしてください。

プラグインを適切に設定すれば次のようにDICOM Managerプラグインメニューが表示されます。


(プラグインリスト)
(DICOM Managerを起動)

次に、DICOM通信の設定(Settings)方法を示します。プラグインの“DICOM Manager”を起動して、この中のスパナの絵のアイコンを選択し、DICOM通信の設定を上から順番に入力していくことができます。


(Settings画面)

一番上は、Tudorが使うためのDICOM画像ローカル保存フォルダの指定
次は、メディアの画像を読み込むための、DICOM DIRの指定
次は、任意のDICOM DIRまでのパスの指定
次は、ImageJ端末の通信時保存先、ImageJのAEタイトルとTCP/IPポートを設定
次は、ImageJと通信する他のDICOMクライアントやPACSクライアントの設定、AEタイトルとTCP/IPポートを指定
Image Selectorは、説明書きがないため詳細は不明です。(どなたか教えてください。)
DICOM SEND(SCU)は、ImageJ端末と接続端末とのリストです。
複数の端末とimageJを接続する場合には、このリストの中のSCUを切り替えてQRを実行します。
一番下のDICOMタグ設定は、リトリーブ対象の画像にイメージプレビューを使用した時に表示させるタグ設定です。

この設定は当たり前ですが、ImageJ端末側の設定で、通信する相手先(例えば、OsiriXやImageJ、dcm4cheeなど)も同様の入力項目があるはずなので、相手先の端末にもImageJ端末のIPアドレスやポートを設定しておくことが必要です。

こちらのサイトに、ImageJとdcm4chee通信例(設定、QR、画像表示まで)が記載されています。

https://sites.google.com/site/makenewlyownworld2013/my-current-study/dicomno-ji-chu/dicomcommunication

画像の通信の後は、通常のImageJの操作と何ら変わりはありません。保存されたDICOM画像を参照して、解析が可能です。

このようにして、ImageJではネットワーク上にある画像データベースを参照し、オンラインで複数画像をダイレクトに表示してリトリーブすることが可能です。また、DICOMヘッダの匿名化転送や、特定のヘッダーデータの値の検証も可能であり、研究や教育目的での画像解析が効率化できます。


(DICOMヘッダー評価機能起動画面)
※特定のタグを指定して、その中の値を検証できる。

本稿では、ImageJプラグイン「Tudor DICOM tools」によるDICOM通信および患者データベースブラウザの紹介とそれの操作方法を説明しました。ImageJの3Dビューワプラグイン、ImageJ-PET-CTフュージョンプラグイン、ImageJ-ディフュージョンテンソルプラグインなど、これまでに紹介したさまざまな最先端の医用画像処理および解析法が、ImageJ-PACSを介してさらに加速化され、医用画像処理研究に従事されている方々のお役に立てれば幸いです。

Amazon Web Serviceの無料利用枠を使って、ImageJクラウド解析環境を作るのも、面白そうですね。もう、なんでもできる・使える時代です。使えるものは使って、効率化していきましょう。
ベンダーとユーザーの本当の協力関係は、お互いWin-Winな、切磋琢磨のスパイラルの中にあるように思います。

話を戻して、次回も続けて複数画像処理の応用について述べます!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(22・6) 2007, p95-97」

2015年9月29日火曜日

第28回 連続画像処理 ImageJマクロプログラムによる複数画像処理で学ぶ!

lmageJは、プラグイン(Plugin)機能やマクロ言語というユーザ自身が作成できる拡張機能を有しています。これらの拡張機能は、プログラマーとしての技術を持たない研究者でも簡単に機能が付加できます。初心者が書いたプログラムは、読みにくい非効率な書き方をされていることが普通です。これは、私も同じです。ここからがみそですが、このようなユーザが、lmageJのサイトにプログラムを公開すれば、そのプログラムがなかなか類を見ない画期的なものであれば、ライセンスにもよりますが、これを必要とするユーザ達がすぐに美しく整理されたプログラムに書き直してくれます。この繰り返し作業によって、ImageJ自身も進化していくので、アカデミックな世界を基盤にして、非商用・商用問わず、いろいろな人たちの相互扶助で、いいスパイラルを生み出しています。

今回は、マクロプログラムの説明をしながら、複数画像処理について解説していきます!

マクロ言語のユーザーインターフェースの概要


ImageJにユーザーオリジナルな機能を搭載する方法は、すでに本連載の第7回にて説明をしました。ImageJのバージョンが上がるにつれて、マクロ作成インターフェイスが改善されているため、ここでは、ImageJのマクロ説明ページを参考にしながら、ポイントを簡潔に説明します。

まず、簡単なマクロ記述と実行の手順を示します。
ImageJメニューのPlugins>New..を選択すると、次の図のようなダイアログが出現します。


この中からMacroを選択します。
すると、次のようなまっさらなマクロエディタ(テキストディタ)が開くので、この中にコードを入力します。

(まっさらなエディタにコードを入力)


入力が完了して、実行する場合は、MacrosメニューのRun Macroかlnstall Macrosを選択すればプログラムが実行されます。

(インストールしたマクロがリストされる)
(マクロ1実行結果)

また、マクロをメニューから実行させたいときは、マクロの宣言のときに、macro “Circle Tool-C00cO11cc”など、マクロの名前の宣言の後にコマンドを入力します。コマンドの対応表は、http://rsb.info.nih.gov/ij/developer/macro/macros.html#iconsを参考にしてください。

例えば、

macro "About ImageJ Action Tool - C059T3e16?" {
       doCommand("About ImageJ...");

    }

というマクロであれば、"About ImageJ Action Tool - C059T3e16?"のように、ハイフン以降に意味不明な文字が並んでいますが、ちゃんと規則があります。
この規則というのは、この例ですと、Crgb+Txysscのコマンドを使っています。非常に簡単です。このCrgbは、カラーをセットするコマンドで、rgbの位置に、RGB(RedGreenBlue)カラーの値を入れます。Txysscは、文字をセットするコマンドで、xyに位置を、ssにフォントサイズを、cに文字を指定します。

このマクロをインストールすると、メニューに「?」マークが追加されます。
「?」でなくても、1文字であればなんでもOKです。

(マクロインストール前)

(マクロインストール後:?に置き換わっている)

次は、ツールバーに明らかに画像に楕円(サークル)を描画してくれそうなマクロをインストールしてみましょう。マクロのコードは次の通りです。

  var radius = 20;//半径を変数としてフィールドに宣言しています。

    macro "Circle Tool - C00cO11cc" {
       getCursorLoc(x, y, z, flags);
       makeOval(x-radius, y-radius, radius*2, radius*2);
    }

    macro "Circle Tool Options" {
       radius = getNumber("Radius: ", radius);
    }

※varという変数型は、macroコードブロックやfunctionコードブロック内で利用しないでください。他の型は大丈夫です。

このコード内容の“C00cO11cc”というのが、ツールバーに「◯」を追加するコマンドです。インストールして、任意のDICOM画像を開き、実行すると、画像上でクリックした場所に20ピクセルの半径を持つ円形ROIを表示します。
また、半径を変更したい場合は、radiusを変更してみてください。


(クリックしたところにROIが表示される)

いろいろな変数は自分で宣言できます。メソッドはbuilt in functionから利用できますし、自分のfunctionを作成することも可能です。
繰り返しメソッドなども実装できます。
詳しくは、本家のサイトからご確認ください。
http://rsb.info.nih.gov/ij/developer/macro/macros.html#intro

マクロの応用例:複数画像処理への適用


ImageJでは、マクロから三次元画像処理プラグインを操作することも可能です。
次のマクロは、Kai Uwe Barthel氏によって提供されている“Volume Viewer”というプラグインをマクロから起動して、スタックを作成するサンプルマクロです。

  macro "VolumeViewer_test" {

  setBatchMode(true);
  run("T1 Head (2.4M, 16-bits)");//サンプルデータを自動でロード
  stack1 = getImageID;
  stack2 = 0;
  n = 36;
  for (i=0; i<n; i++) {
    showProgress(i, n);
    selectImage(stack1);
    angle_y = i * 10;
    run("Volume Viewer", "display_mode=4 scale=2 axes=0 interpolation=2
angle_x=0 angle_z=0 angle_y="+ angle_y );
    run("Copy");
    w=getWidth; h=getHeight;
    close();  
    if (stack2==0) {
      newImage("Plots", "RGB", w, h, 1);
      stack2 = getImageID;
    } else {
      selectImage(stack2);
      run("Add Slice");
    }
    run("Paste");
  }
  setSlice(1);
  run("Select None");
  setBatchMode(false);

  }

マクロプログラムは体軸(y軸)中心に投影角10°ずつ回転を繰り返すものです。これによって、自動で角度が変更された三次元画像が、スタックとして表示されます。

もう1つ例として、CT画像からHU値を取得するマクロを紹介します。ImageJはCT画像を表示した時にRawDataのピクセル値をDICOMタグの情報から再計算して表示しています。マクロから直接getPixel(x,y);をすると、CT値(HU)ではなく、RawDataのピクセル値が取得されます。一方で、CT値を直接計算してみたい時もあります。
Image to Resultsなどの機能でもCT値を取得することが可能ですが、自分の計算を試したい時などは一旦エクセルにコピーするなどの操作が必要です。こういった場合に、CT画像のピクセル値からCT値を取り出し、CT値に対して何らかの計算を施して、結果を出力するマクロは便利です。

以下、その例です。

//Please notice, IJ double quartation is unique."xxxx,xxxx"
//HU = CTNumber (7FE0,0010) * rescale slope (0028, 1053) + y intercept (0028, 1052).
//These HU values have to be converted to pixel intensity f(x,y) using f(x,y) = ((HU-P1)*pow(2,i-1))/W, where P1 is the window left border, i is the radiometric resolution and W is the window width.

stCTNum = getInfo("7FE0,0010");
stintercept = getInfo("0028,1052");
stslope = getInfo("0028,1053");

CTNum = parseInt(stCTNum);
intercept = parseInt(stintercept);
slope = parseInt(stslope);

for(x=0;x<512;x++){
for(y=0;y<512;y++){
//get raw value
v = getPixel(x,y);
//calibrate linear gray scale value
HU =  calibrate(v);
print(HU);

//if you need calcurate using any equation,
//yourNeedsValue = HU* ~ (javaに基づいてやりたい計算を記述);
//print(yourNeedsValue)

}
}

このように、ImageJのプラグインとマクロをうまく組み合わせてコードを書けば、ユーザーオリジナルの処理が可能となります。

ImageJのサイトには何百ものサンプルプラグインやマクロがアップロードされているため、ユーザは全くゼロの状態から作成する必要がなく、そのサンプルコードを参考にしながら改編すればよいということになります。

今回はマクロを試用した複数の画像処理の基本とサンプルを提示しました。次も続けて複数画像処理を用いた臨床応用例を紹介します!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(22・5) 2007, p126-128」

2015年9月28日月曜日

第27回 連続画像処理 ImageJによる動画像の取り扱いについてで学ぶ!

lmageJでは、いくつかの動画ファイルを扱うことができます。また、ビデオキャブチャやWebカメラなどからダイレクトにスタックとしてlmageJに取り込み、前回説明したような連続画像処理や解析をすることもできます。
今回は、lmageJにおける動画像の取り扱いについて、例を示しながら解説を行います!

代表的な動画フォーマットの取り扱いについて


動画フォーマットとして代表的なものは、“AVI”フォーマットと“QuickTime”フォーマットでではないでしょうか。
同じ動画フォーマットでも、MPEG(Moving PicturExperts Group)などもありますが、動画データが圧縮されているかが違いです。
AVI(Audio Video lnterleaving)は、Microsoft社によって開発されたWindows上での音声つきの動画を扱うためのフォーマットです。一方、QuickTimeは、Apple社が開発したAVIと同様のフォーマットです。

まず、ImageJでAVIフォーマットの動画像を取り込む方法を説明します。
すでに、現行のImageJはAVIの入力とスタック画像からのAVI出力機能を備えています。
AVIファイルを読み込みたい場合は、File>Import>AVIから、AVIファイルを読み込むだけです。
AVIファイルを書き出したい場合は、スタック画像に対して、File>SaveAsから、フレームレートを指定して、AVIファイルを作成できます。
これらの機能の詳細は、ImageJのサイトから、AVIファイル読み込みプラグインである”AVI Reader”のソースを確認することも可能です。

次の図は、腹部CT画像をスタックとしてImportし、SaveAsでAVIファイルとして書き出したデータです。


次に、QuickTimeフォーマットの取り扱いについて解説していきます。
MacOS用のImageJをインストールした場合は、AVIフォーマットと同様、こちらはImageJのデフォルトでQuickTime関連の操作が可能です。読み込みにはFile>Importを使います。
もし、File>ImportにQuicktimeがリストされない場合は、QuickTime_Plugins.jar をダウンロードし、plugins/Input-Outputフォルダに保存してください(http://rsb.info.nih.gov/ij/plugins/qt-capture.html)。そして、他のプラグイン同様、ImageJをリスタートして利用可能になります。
(上手く動作しない場合は、Fiji:(http://fiji.sc/Fiji)で試してください。)

次の図は、MacOS上でImageJとは別の医用画像プロセッシングソフトウェアである”OsiriX”で作成したQuickTimeフォーマットのCTコロノグラフィー動画像をImageJのスタックとして表示し、QuickTimeプレーヤを起動した例です。


ImageJを用いた動画像解析の実例


ImageJを用いた動画処理の典型的な解析事例を1つ紹介します。
前述の動画フォーマットの各フレームを表示した後のステップとして「動きの解析」が最も重要な部分です。
ImageJでも多くの解析手法が紹介されています。
動画像解析の適応事例として、医用画像解析では、MRIによる心臓の動きや肺の横隔膜の動きの解析、PET画像を用いた動態解析、さらに整形や歯科口腔外科などの分野では、関節の動きの解析など、さまざまな動画像解析が試みられてきました。また、電子顕微鏡などの分野では、ウィルス、生きた細菌や細胞の挙動(軌道)解析などが挙げられます。

参考記事では、Guy Levy氏の説明するImageJによる粒子追跡プラグイン“Particle Tracker”(http://mosaic.mpi-cbg.de/ParticleTracker/)を用いて、動画解析法の一例が説明されています。

このプラグインは、特に細胞生物学のビデオデータからの粒子軌道の自動検知、および粒子の特徴ポイントを追跡するツールとして紹介されていますが、電子顕微鏡によるビデオ映像のみでなく、いろいろな動画像解析に適応でき、そのアルゴリズムのデザインや操作法を知ることはユーザにとって大変参考になります。2015年9月現在、チューリッヒ工科大学のMOSAIC groupが中心となって改良を進めています。(Fijiにも対応しています。)

現在、いろいろと改良を進めている関係で、jarファイルの関連パッケージが含まれていなかったりして、セットアップに時間がかかりそうなので、本稿ではご紹介を割愛させていただきます。(3D機能あたりの先方の開発が落ち着いたら、またご紹介できるといいのですが。)テストデータやプラグインは説明サイト(http://mosaic.mpi-cbg.de/ParticleTracker/tutorial.html)からダウンロードできるようになるはずです。

PIV (Particle Image Velocimetry) 


複数画像の解析例として、もう1つご紹介します。Particle Image Velocimetry(粒子画像流速測定法)です。

このプラグインは、Qingzong博士が作成したプラグインの一つです。測定対象となる画像を処理前、処理後の2枚のペアで用意し、この2つの画像の相関法をオプティックフロー計測に利用します。
基本的に、この画像のペアは、小さな検査窓(放射線医療画像でいうところの関心領域群)に分けられます。
これらの画像ペア関心領域間の相互相関として、オプティックフロー(流れを視覚的に表したもの)を測定します。このオプティックフローは、変位や、オブジェクトの速度で表現します。この計算で設定する検査窓を小さくすることで、より良好なPIVを行うことができます。最終的なPIV解析結果は、ベクトルプロットとして表示されます。

それでは、チュートリアルに沿って、実際に解析した結果を示します。
まず、プラグインファイルをいつも通り準備したのち、サンプルデータをダウンロードして、ImageJで開きます。


(2枚のペアサンプル画像)
※少し変化しているのがわかりますか?
わかりにくい場合は、こちらのPIV紹介ページをどうぞ。

次に、Plugins>PIV>iterative PIV(cross correlation)を選択して、デフォルトのまま実行します。
すると、検査窓の設定値(interrogation window size)の異なるテンプレートマッチング結果を3つ得ることができました。

(1)

(2)

(3)

ペアの画像間で、粒が動いた量に相関して、ベクトルプロットの強度が色分けとベクトルの大きさで表示されていることがわかります。

より詳細な設定をして実行したい場合には、iterative PIV(advanced)で、インターフェースに設定された設定値を変更することができます。例えば、search window sizeやオプティカルフロー図に表示するベクトルの間隔(Vector spacing)を設定可能です。

処理後もポストプロセッシングが可能です。このポストプロセスには、相関係数の中央値や平均値を利用した特有の値を利用して、オプティカルフローを再計算させることができます。

また、計算結果はテキストとして保存され、もう一度読み込んで再計算させることができます(PIV>plot...)。このとき、表示されるインターフェースの下部のベクトルプロット表示をマグニチュード表記にするチェックをつけると、プロット表示を変更することができます。

(マグニチュードプロット) 

今回、複数画像解析事例として使用したPIVは、これから先にも紹介する基本的なテンプレートマッチングなどを駆使した細胞生物学の分野で重宝される機能です。

次回も続けて複数画像処理を用いた臨床応用例を紹介します!

Reference
  • 山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(22・4) 2007, p98-99」