シリーズ5.ImageJマクロ言語を用いた画像解析~マクロ言語のまとめ2~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。 今回の記事ではImageJのユーザー定義関数について学んでいきます。

目次

ユーザー定義関数とは?

ImageJにはじめから入っている関数(Built-in Macro Functionsにある関数)ではなく、ユーザー自身が定義した関数のことです。
同じ処理を繰り返し実行するときに、一度ユーザー関数として記述しておくと同じ処理についてはコードを書く必要がなくなるなどの利点があります。
記述の仕方は下記のようになります。



① 返り値がある場合

function 関数の名前(引数1, 引数2…)
{

命令文

return; *値を返すときに必要(返り値)

}

② 返り値がない場合

function 関数の名前(引数1, 引数2…)
{

命令文


}

◆画像の中で輝度値が10以上50以下, 80以上120以下、150以上200以下であるピクセル数をカウントする関数

任意の画像を開いて下記のスクリプトを実行してみましょう。


① 返り値を記述する場合

run("8-bit");
width=getWidth();
height=getHeight();

function Count(a, b) {
Num=0;
for(y=0;y<height;y++){
                for(x=0; x<width;x++){ 
                        Intensity=getPixel(x,y);
                        if(Intensity>=a && Intensity<=b){
                                Num++;
                                
                        }
                }
}

return Num;
}

Total_1=Count (10, 50);
Total_2=Count (80, 120);
Total_3=Count (150, 200);
print("10以上50以下のピクセル数", Total_1);
print("80以上120以下のピクセル数", Total_2);
print("150以上200以下のピクセル数", Total_3);
返り値ありのコード
※10以上50以下, 80以上120以下、150以上200以下であるピクセル数をカウントする→本来Count関数内に記述した命令文を3回記述する必要がありますがユーザー定義関数を使うと、1回Count関数内に記述することであとはCount (a, b);と書くだけで同じ処理を実行することができます。


また返り値を書かずに下記のように記述することも可能です。


② 返り値を記述しない場合

run("8-bit");
width=getWidth();
height=getHeight();

function Count(a, b) {
Num=0;
for(y=0;y<height;y++){
                for(x=0; x<width;x++){ 
                        Intensity=getPixel(x,y);
                        if(Intensity>=a && Intensity<=b){
                                Num++;                        
                        }
                }
}
print(Num);

}

Count(10, 50);
Count(80, 120);
Count(150, 200);
返り値なしのコード
※ImageJサンプル画像のLena.tifで実行すると下記のような結果が出力されます。

スクリプト①

スクリプト②

まとめ

ユーザー定義関数の書き方や使い方が理解できたでしょうか。
ユーザー定義関数をうまく取り入れてスクリプトを記述できるようになると、スクリプトが短くなるだけでなくエラーが表示されたときの修正も簡単にできるようになります。
次回の記事からはシリーズ6 マクロ言語を使った画像処理の応用編としてより高度な画像処理を学んでいきたいと思います。