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

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」

0 件のコメント:

コメントを投稿