画像解析ソフトの定番 ImageJ のまとめ

前ページへ | 目次 | 次ページへ
(このページのオリジナルページ:ImageJ Macro Language


はじめに

macro(マクロ)とは、ImageJで一連のコマンドを自動化するシンプルなプログラムのことである。マクロを作成するもっとも簡単な方法は、command recorder(コマンドレコーダー)を使って、一連のコマンドを記録することである。マクロはテキストファイルとして保存されていて、マクロを実行するには、メニューコマンドを選択するか、キーを押すか、ImageJツールバーのアイコンをクリックする

ImageJ ウェブサイトには、300以上のマクロのサンプルがある。試用するには、ブラウザのウィンドウでマクロを表示させ、全体をクリップボードにコピー([CTRL]+"a"、[CTRL]+"c")したら、ImageJに切り替え、エディターウィンドウを開いて([CTRL]+[SHIFT]+"n")貼り付け(ペースト)し([CTRL}+"v")、エディターの Macrosメニュー>Run Macro コマンド([CTRL]+"r")で動作させる。サンプルマクロのほとんどは ImageJ フォルダの中にある macros フォルダにも入っている。

実例 "Hello World"

例として、1行の "Hello World" マクロを作成し、動作させ、インストールしてみよう。まず、Pluginsメニュー>New>Macro (または [SHIFT]+"n")を選び、エディターウィンドウを開く。エディターウィンドウで、下の行を入力する:
print("Hello world");

マクロをテストするには、エディターの Macrosメニュー>Run Macro コマンド(または[CTRL]+"r")を使う。保存するには、Fileメニュー>Save As コマンドを使う。Save As (別名で保存)ダイアログボックスには、ファイル名として "Hello_World.txt" と入力し、"Save" (保存)をクリックする。ImageJ を再起動すると、マクロは自動的に Plugins メニューに "Hello World" コマンドとしてインストールされる。前提として、ファイル名でアンダースコア "_" を使われていること、マクロは Plugins フォルダかその内部にあるサブフォルダに保存してあること。Pluginsメニュー>Shortcuts>Create Shortcut を使ってショートカットを作成すると、キー1つを押すことでマクロを実行できる。

マクロを再び開くには、Fileメニュー>Open または Pluginsメニュー>Macros>Edit を使うか、マクロのファイルを "ImageJ" ウィンドウにドラッグ&ドロップする。

204 個の Hello World プログラムが ACM Hello World! ウェブサイトで利用できる。

マクロ生成に Command Recorder (コマンドレコーダー)を利用


簡単なマクロは、command recorder(コマンドレコーダー)(Pluginsメニュー>Macros>Record)を使って生成できる。例えば、下のマクロは選択範囲を計測してラベルを付けるマクロである。
run("Measure");
run("Label");

このマクロは、レコーダー動作中に Analyzeメニュー>MeasureAnalyzeメニュー>Label コマンドを使うと生成される。このマクロを Plugins フォルダかその中のサブフォルダに、"Measure_And_Label.txt" という名前で保存して、ImageJ を再起動すると、Plugins メニューに新しく "Measure And Label" というコマンドができる。この新しいコマンドにキーボードショートカットを割り当てるには、Pluginsメニュー>Shortcuts>Create Shortcut を使う。



この実例では、"Measure And Label" マクロは、"F1" キーに割り当てられている。マクロのファイル名のアンダースコア "_" が、コマンド名ではスペースに変換されているのに注意(マクロ名では一つ以上のアンダースコアが必要)。

Macro Sets(マクロセット)

1つのマクロファイルには2つ以上のマクロを含めることができる。macro キーワードを使って、それぞれのマクロが宣言される。
macro "Macro 1" {
    print("This is Macro 1");
}

macro "Macro 2" {
    print("This is Macro 2");
}

この実例では、2つのマクロ、"Macro 1" と "Macro 2" が定義されている。これらのマクロを試してみるときは、全体を選択し、Copy(コピー)し([CTRL]+"c")、ImageJ に切り替え、エディターウィンドウを開き([CTRL]+[SHIFT]+"n")、Paste (貼り付け)し([CTRL]+"v")し、エディターの Macrosメニュー>Install Macros コマンドを選ぶ。そして1つ目のマクロを動かすときは Macrosメニュー>Macro 1 を、2つ目を動かすときは Macrosメニュー>Macro 2 を選ぶ。

マクロセット内のマクロでは、global variable (グローバル変数)を使うとお互いに情報をやりとりできる。
var s = "a string";

macro "Enter String..." {
    s = getString("Enter a String:", s);
}

macro "Print String" {
    print("This is Macro 2");
}
上の2つのマクロを含むマクロファイルを作成するには、エディターの Fileメニュー>Save As コマンドを使う。名前は "MyMacros.txt" のように何かつけて ImageJ フォルダ内の macros フォルダに保存する(注意:ファイル名には ".txt" 拡張子が必要)。そして Pluginsメニュー>Macros サブメニューにマクロをインストールするには、Pluginsメニュー>Macros>Install コマンドを使い、ファイルを開くダイアログボックスで "MyMacros.txt" を選ぶ。名前を "StartupMacros.txt" に変えると、起動時に自動的にマクロがインストールされる。

Keyboard Shortcuts(キーボードショートカット)

マクロセット内のマクロには、マクロ名の後ろに、四角カッコ "[ ]" 内にキーボードショートカットを書くことで、ショートカットを割り当てられる。
macro "Macro 1 [a]" {
    print("The user pressed 'a'");
}

macro "Macro 2 [1]" {
    print("The user pressed '1'");
}
この例では、"a" を押すと最初のマクロが、"1" を押すと次のマクロが動作する。これらのショートカットは、Editメニュー>Selection>Select AllAnalyzeメニュー>Gels>Select First Lane のショートカットとだぶっているため、これら元のキーボードショートカットを使うには、同時に [CTRL]キーを(Mac の場合はコマンドキーを)押す必要がある。

注意点は、キーボードショートカットは、マクロがインストールされていて、"ImageJ" ウィンドウまたは images (画像)ウィンドウがアクティブな(前面にある)ウィンドウになっており、キーボードにフォーカスがあるときに機能することである。マクロをインストールするには、マクロエディターの Macrosメニュー>Install Macros コマンドか、Pluginsメニュー>Macros>Install コマンドを使う。上の例で2つのマクロをインストールすると、下のようなコマンドが、

Macro 1 [a]
Macro 2 [1]

Pluginsメニュー>Macros サブメニューに追加される。これらのマクロを、macrosフォルダの "StartupMacros.txt" という名前のファイルに保存すると、マクロは ImageJ 起動時に自動的にインストールされる。

ファンクションキー([F1]、[F2] 〜 [F12]) とテンキーパッド([n0]、[n1] 〜 [n9]、[n/]、[n*]、[n-]、[n+] または [n.])(訳注:[n○] はテンキーパッドのキーの意味) もショートカットに使える。ImjageJ では、ファンクションキーのショートカットが、2つ以上のプラグインで使われてだぶっている場合、エラーメッセージが表示される。テンキーパッドのショートカット(ImageJ 1.33g またはそれ以降で利用可能)は、マクロでしか利用できないので、だぶることはない。注意点は、PC では、Num Lock のライトが点灯しているときでないとテンキーパッドのショートカットが使えないこと。より詳細な実例(KeyboardShortcuts)が利用できる。

Tool Macros(ツールマクロ)

ImageJ ツールバーに付け加えるツールを作成するマクロを定義することができる。マクロツールには3種類がある。image tool(画像ツール)、action tools(アクションツール)と menu tools(メニューツール)である。 これらの3種類のツールをあわせて tool set(ツールセット)をつくることができる。Tool sets(ツールセット)は、必要なときだけツールバーの >> アイコンをクリックする表示できる。
Image Tools 画像ツール
画像ツールは、ユーザーがそのツールで画像をクリックすると実行される。マクロは "ツール名 - xxxx" で終わる名前で定義される。"xxxx" は、ツールアイコンを定義する16進数のコード(下で説明)である。下のは画像ツールの実例で、ユーザーが画像をクリックするたびに、その点の座標を表示する:
macro "Sample Tool - C0a0L18f8L818f" {
    getCursorLoc(x, y, z, flags);
    print("Sample: "+x+" "+y);
}
このツールをインストールするには、エディターウィンドウを開いて(Pluginsメニュー>Macros>New)、マクロに貼り付け(ペースト)し、エディターのメニューで Macrosメニュー>Install Macros コマンドを使う。このマクロを macros フォルダ内の "StartupMacros.txt" という名前のファイルに入れると、ImageJ 起動時に自動的にインストールされる。1つのマクロファイルは、8つまでのツールマクロと、ツールでないマクロはいくつでも格納できる。マクロファイルは拡張子が ".txt" か "ijm" でないといけない。

ユーザがツールをダブルクリックすると、設定ダイアログボックスが表示される。このように設定するには、ツールと同名で " Options" を付け足した名前のマクロをつくると、ユーザーがツールアイコンをダブルクリックする度にそのマクロが呼び出される。この例では、ユーザーが円ツールアイコンをダブルクリックすると、getNumber ダイアログボックスが表示される。
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);
}
Action Tools(アクションツール)
ツールマクロで、名前が "Action Tool" で終わっているものは、ツールバーのアイコンをクリックすると、何かのアクションを起こす。下の例では、ユーザーがクエスチョンマーク型のツールアイコンをクリックすると、 "About ImageJ" ウィンドウが表示される。
macro "About ImageJ Action Tool - C059T3e16?" {
    doCommand("About ImageJ...");
}
注意点は、ダイアログボックスを表示するタイプのアクションツールコマンドは、run() 関数を使って呼び出しても正しく作動しないことである。

より多くの実例は、http://rsb.info.nih.gov/ij/macros/tools/ または ImageJフォルダ内の macros/tools フォルダにある。Fileメニュー>Openを使うか、またはドラッグ&ドロップで、これらのファイルを1つ開くと、そのファイルに定義されているツールが自動的にインストールされる。Pluginsメニュー>Macros>Installコマンドを使うと、エディタウィンドウを開かずにツールをインストールできる。
Menu Tools(メニューツール)

ツールバーにメニューを追加するには、newMenu 関数を利用できる。Toolbar Menus マクロでは、このやり方が説明されている。画像を右クリックすると現れる contextual menu(コンテクストメニュー)をカスタマイズすることもできる。CustomPopupMenu マクロでこの方法が説明されている。
Tool Sets ツールセット
マクロファイルには、ツールマクロは最大8つまで、通常のマクロはそれとは別にいくつでも含められる。マクロツールを含むマクロファイル(マクロセット)は、tool set(ツールセット)と呼ばれる。tool set を ImageJ フォルダの macros/toolsets フォルダに保存すると、ツールバーの右端の >> メニューにそのツールが現れる。>> メニューから tool set を選ぶと、そこに含まれるツールがツールバーにインストールされる。 >> メニューから "Startup Macos" を選ぶと、ツールセットがデフォルトに戻る。

ImageJ のウェブサイトの /ij/macros/toolsets フォルダには、13個の tool set の実例がある。
Tool Icons(ツールアイコン)
ツールマクロのアイコンは、シンプルでコンパクトな指示のセットで、コマンドの1文字と、2つまたはそれ以上の16進数の小文字からなる。
コマンド説明
Crgb色を設定
Bxy基本の位置(座標)を設定 (デフォルトは (0,0))
Rxywh長方形(輪郭線)を描く
Fxywh長方形(塗りつぶし)を描く
Oxywh楕円(輪郭線)を描く
oxywh楕円(塗りつぶし)を描く
Lxyxy直線を描く
Dxy点を描く(1.32g またはそれ以降)
Pxyxy...xy0多角形を描く
Txyssc文字を描く

ただし、x (x 座標), y (y 座標), w (幅), h (高さ), r (赤), g (緑) および b (青)は0-15までの範囲の値を表す16進数(小文字)である。文字を描く(T)ときは、ss はフォントサイズをポイントで表した二桁の数字(例:14)で、c はASCII 文字である。

Variables(変数)

ImageJ のマクロには(変数の)型がない。変数は最初に宣言する必要がなく、データ型を明示しなくともよい。変数への代入文で使われるとき、自動的に初期化される。変数には、数値、文字列、行列を含めることができる。事実、ひとつの変数が時により、これらのどれかであることができる。数値は64ビットの倍精度浮動小数点形式で保存される。

変数名では大文字小文字が区別される。"Name" と "name" は、異なる変数である。

下の例では、同じ変数に、数値、文字列、行列が代入される。
v = 1.23;
print(v);
v = "a string";
print(v);
v = newArray(10, 20, 50);
for (i=0; i<v.length; i++) print(v[i]);
このコードを実行するには、コードを選択し、クリップボードにコピーし([CTRL] + "c")、ImageJ に切り替え、エディタウィンドウを開き(Editメニュー>New)、貼り付け([CTRL] + "v")たあと、[CTRL] + "r" を押す(注意:マックでは、[CTRL] キーの代わりにAppleキーを用いる)。

Global variables(グローバル変数)は、'var' 命令文を使って、変数を使うマクロよりも前に宣言する必要がある。例えば:
var x=1;

macro "Macro1..." {
    x = getNumber("x:", x);
}

macro "Macro2" {
    print("x="+x);
}
'var' 命令文は、マクロや関数(function) のコードブロック内で使ってはいけない。マクロや関数内で 'var'を使うと、失敗の原因となるかもしれない。

演算子(Operators)

ImageJ のマクロ言語では、標準的な Java の演算子をほぼすべて、優先レベルの演算子は少数だが、サポートする。
演算子(Operator)優先度(Prec.)説明(Description)
++11回前/後の増分(increment)
--11回前/後の減分(decrement)
-1マイナスにする
!1ブーリアン演算子の否定(boolean complement)
~1ビット単位の否定(bitwise complement )
*2乗算(multiplication)
/2除算(division)
%2メモ(remainder)
&2ビット単位の「論理積(どちらも)」(bitwise AND)
|2ビット単位の「論理和(または)」 (bitwise OR)
^2ビット単位の「排他的論理和(どちらかのみ)」(bitwise XOR)
<<, >>2左移動(left shift)、右移動(right shift)
+3加算または文字列の付加
-3減算(subtraction)
<, <=4小なり(less than)、小なりイコール(less than or equal)
>, >=4大なり(greater than)、大なりイコール(greater than or equal)
==, !=4等しい(equal)、等しくない(not equal)
&&5ブーリアン演算子の「論理積(両方)」(boolean AND)
||5ブーリアン演算子の「論理和(どちらか)」(boolean OR)
=6代入(assignment)
+=, -=, *=, /=6演算して代入(assignment with operation)
if/else 命令文
if 命令文は、ブーリアン表現の値に依存して条件により別の命令文を実行する。下のような形式である:
if (条件) {
    命令文
}
条件が検討される。もしそれが真なら、コードブロック(命令文の部分)が実行され、条件が偽なら実行されない。この例では、少なくとも1枚の画像が開かれていれば、アクティブな画像のタイトルが印字され、そうでなければ何もしない。
if (nImages>0) {
    title = getTitle();
    print("title: " + title);
}
if 命令文には、オプションとして else 命令文を含めることができる:
if (条件) {
    命令文
} else {
    命令文
}   
この場合、else の後のコードブロックは、条件が偽だったときのみ実行される。画像が開かれていなければ、この例は "No images are open" と印字し、そうでなければアクティブな画像のタイトルを印字する。
if (nImages==0)
    print("No images are open");
else
    print("The image title is " + getTitle);
注意点は、 "==" 演算子は比較に、 "=" 演算子は代入に使われること。この例では、中カッコが省かれている。コードブロックが1命令文だけで構成されているときは必要ないからである。

マクロ言語には、switch 文がないが、if/else 文を使うと同じようなことが可能である。下が実例である:
type = selectionType();
if (type==-1)
    print("no selection");
else if ((type>=0 && type<=4) || type==9)
    print("area selection");
else if (type==10)
    print("point selection");
else
    print("line selection");
ループ命令文(for、while および do 〜 while)
ループ命令文は、コードブロックを繰り返し実行させるのに使われる。ImageJ マクロ言語では、3種類のループ宣言がある:
  • for - コードブロックを指定した回数だけ実行する。
  • while - while の条件が真である間だけコードのブロックを繰り返し動作させる。
  • do 〜 while - コードのブロックを一度動作させ、その後は条件が真である間だけ繰り返す。
for 命令文は以下の形式で記述する:
 
for (初期化; 条件; 増分) {
    実行文
}
初期化(initialization)とは、ループの最初に1回だけ実行される文である。条件(condition)は、ループの各回の先頭に検討され、結果が偽立った場合、ループは終了する。最後に、増分(increment)とは、ループの各回の後に実行される文である。

この実例では、for ループが使われて、0, 10, 20...90 の値がプリントされる。
for (i=0; i<10; i++) {
    j = 10*i;
    print(j);
}
ループ内に命令文が1つだけある場合は、中カッコ "{ }" を省略可能である。
for (i=0; i<=90; i+=10)
    print(i);
while 命令文は、下のような形式になっている:
 
while (条件) {
    命令文
}
最初に条件が検討される。もし真なら、命令文のコードブロックが実行される。while 命令文では、条件のチェックとコードブロックの実行を、条件が偽になるまで続ける。

この実例では、while ループが 0, 10, 20...90 の値をプリントするのに使われている。
i = 0;
while (i<=90) {
    print(i);
    i = i + 10;
}
do 〜 while 命令文は、下のような形式になっている。:
 
do {
    実行文
} while (条件);
do 〜 while は、ループの先頭で条件を検討するのではなく、最後に検討する。 したがって、コードブロックが最低1回は実行される。

この実例では、do 〜 while ループが 0, 10, 20...90 の値をプリントするのに使われている。
i = 0;
do {
    print(i);
    i = i + 10;
} while (i<=90);
ユーザー定義関数 User-defined Functions

関数 function とは、呼び出すことができるコードのブロックで、値を受け取って返すことができる。ImageJ のマクロ言語は、2種類の関数を持つ:あらかじめ組み込みのものと、ユーザーが定義するものである。ユーザー定義関数は下のような形式になっている:
function 関数名(引数1, 引数2. 引数3) {
    命令文
}
関数では、値を返すときに return 命令文を使うことができる。
       function sum(a, b) {
          return a + b;
       }
関数を呼び出す際の引数の個数は、関数の定義時の引数の個数と一致しないといけない。sum()関数は、2つの引数をもつので、呼び出す際には、2つの引数とともに呼び出す必要がある。
        print(sum(1, 2));
引数のない関数を定義するときも、カッコを付ける必要がある:
       function hello() {
          print("Hello");
       }
そして、組み込みの関数と違い、カッコ付きで呼び出す必要がある。
       hello();
基本のデータ型(文字列、数値)は、値により関数に渡される。配列は参照により引き渡される。
文字列(string)の取り扱い

ある文字列が別の文字列に含まれているかチェックするには、indexOf() 関数を用いる。ある文字列が別の文字列の先頭や末尾についているかを調べるには、startsWith()endsWith() 関数を用いる。文字列の一部を取り出すには、substring() を使う。文字列の長さをみるには lengthOf() 関数を使う。

文字列を比較するには、 "=="、 "!="、 ">" や "<" の演算子を用いる。この比較は大文字小文字を区別しない。例えば、下のコードは 真 (true) を表示する。
ans = "Yes";
if (ans=="yes")
    print ("true");
else
    print("false");
マクロ言語を拡張する

マクロ言語に、Java コードとして実行される関数を追加するには2つの方法がある。ひとつは、プラグインに定義されたスタティックなメソッドを call 関数を使って呼び出すこと。もうひとつは、MacroExtension インターフェイスを実行するプラグインを書くこと。ImpProps プラグインでは、call 関数を使って画像のプロパティーを取り出したり、設定したりする方法について、Image5D_Extensions プラグインは、Image5D プラグインと連携する MacroExtension (Ext) 関数の使い方を示している。
コマンドラインからのマクロ実行

コマンドラインからマクロを実行でき、コマンドラインのオプションで -macro-batch を使い、文字列の引数を引き渡せる。実例として、下のマクロは、ユーザーのホームディレクトリ内の 'images' ディレクトリの画像を開く:
name = getArgument;
if (name=="") exit ("No argument!");
path = getDirectory("home")+"images"+File.separator+name;
setBatchMode(true);
open(path);
print(getTitle+": "+getWidth+"x"+getHeight);
そのファイルが 'OpenImage.txt' と名付けられ、 macros フォルダにあると仮定する。下のコマンドを実行すると、
java -jar ij.jar -macro OpenImage blobs.tif
ImageJ が起動し、log(ログ)ウィンドウには "blobs.tif: 256x254" と表示される。ImageJ は拡張子が '.txt' で、ImageJ フォルダ内の macros ディレクトリにあると仮定する. あるいは下を実行すると、
java -jar ij.jar -batch OpenImage blobs.tif
ImageJ は起動せず、terminal ウィンドウに "blobs.tif: 256x254" と表示される。

ImageJ で使えるすべてのコマンドラインオプションの説明が、rsb.info.nih.gov/ij/docs/install/linux.html#options で利用可能である。
マクロのデバッグ (debugging)
Debug メニューのコマンドを使うと、マクロのデバッグができる。Debug メニューは ImageJ 1.42 のマクロエディターに加えられた。デバッグをはじめるときは、[CTRL]+'d' を押す(Debug Macro)。 そして、繰り返し [CTRL]+'e' (Step)を押してマクロコードを1ステップずつ実行できる。

Debug メニューにはコマンドが7つある:

  • Debug Macro (マクロをデバッグ)- マクロをデバッグモードで実行させ、"Debug" ウィンドウが開く。このウィンドウには初期状態ではメモリ使用量、開いている画像の数、アクティブな画像のタイトルが表示される。マクロは、コードの最初に実行可能な行(反転表示されている)で停止する。実行を継続するには、舌のコマンドのどれかを使う。
  • Step(ステップ) - 反転表示される実行文を実行し、次に進む。"Debug" ウィンドウでは変数名とその値が更新される。
  • Trace(トレース) - マクロを実行し、 利用された変数名とその値が"Debug" ウィンドウに表示される。
  • Fast Trace(高速トレース) - 上と同じだが、より速い。
  • Run(実行) - マクロを終了まで、通常の速さで動作させる。
  • Run to Insertion Point (挿入点まで実行)- あらかじめ指定した行まで実行する(コードの実行可能な行でマウスをクリックすると定義できる)。
  • Abort(中止) - マクロから出る。

Amazon リンク
※ Kindle版(iPad, Android)あり

※ Kindle版(iPad, Android)あり

※ Kindle版(iPad, Android)あり




(このページのオリジナルページ:ImageJ Macro Language
前ページへ | 目次 | 次ページへ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます