2017年1月26日 更新

シリーズ4.ImageJマクロ言語を用いた画像解析~②二値化処理-3~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。

19,136 view お気に入り 2

【if文の中に条件を2つ書きたいとき】

これまでの記事ではif文の中に記述する条件は一つのみで他に条件を記述するときはelseやif文を2つ用いてきました。今回はif文に条件を2つ書くことを考えます。
今回の例では&&を使用して2つ条件を記述することが可能です。
A && B; AかつBと意味で、AとBの両方が成り立つという条件を示します。


【上位5% (5パーセンタイル) 】

画像の輝度値の分布で輝度値0から順にピクセル数を足していったときに全体の95%を占めるピクセル数limに到達したらその輝度値 を閾値Thrとします。


 (2814)

上記をふまえマクロで記述すると、以下のようになります。

◆スクリプト

open("C:\\Users\\Hiro\\Downloads\\Rat_Hippocampal_Neuron2.zip");
run("Split Channels");
selectWindow("C2-Rat_Hippocampal_Neuron2.tif");
run("Grays");
run("8-bit");

width=getWidth();//画像の横幅を取得
height=getHeight();//画像の高さを取得

percentile=5; //任意の数値に変更可能。
lim=width*height*(1-percentile/100);//全体のピクセル数のうち下位95%を占めるピクセル数

getHistogram(AryI, AryF, 256);//AryFはピクセル数、AryIは対応する輝度値、8bit画像なのでピクセル数と輝度値の対応が0-255までの256個取得されることを示します。したがって、配列AryFにピクセル数が、配列AryIに輝度値がそれぞれ256個ずつ格納されます。

total=0;//変数totalの宣言, 輝度値0から順にピクセル数を足した合計のピクセル数
Thr=0;//変数Thrの宣言,  閾値
Counter=0;//変数Counterの宣言

for (i=0;i<256;i++){
        total+=AryF[i];//配列AryFのi番目に格納されているピクセル数を変数totalに足してtotalに代入する。
        if (total > lim && Counter ==0)//変数totalがlimより大きくかつ変数Counterが0のとき
        {
                Counter++;//Counterの数値に1を足す
                Thr=i;//閾値Thrにiを代入する
        }//変数totalがはじめてlimより大きくなったときの閾値は輝度値iであり、このfor文は1回のみ実行されればよい。したがって、変数total>limという条件かつ変数Counterが0であるという条件を定義する。for文が1回実行されるとそれ以降はCounter=1, 2…となりif文にCounter==0という条件がついていることでfor文が2回以上実行されることはない。
}
for(y=0;y<height;y++){
        for(x=0; x<width;x++){ 
                Intensity=getPixel(x,y);
                if(Intensity>Thr){
                        setPixel(x,y,0); 
                }else{
                        setPixel (x,y, 255); 
                }
        }
}//あとの二値化処理は以前の記事(シリーズ3.ImageJマクロ言語を用いた画像解析~②二値化処理-1~)で学んだ時のスクリプトと同じです。
Percentile-1.macro
以下のような二値化ができましたか?
 (2819)

*補足ですが、if (x > lim && Counter ==0){ }のところをbreakを使って記述することもできます。
open("C:\\Users\\Hiro\\Downloads\\Rat_Hippocampal_Neuron2.zip");
run("Split Channels");
selectWindow("C2-Rat_Hippocampal_Neuron2.tif");
run("Grays");
run("8-bit");

width=getWidth();//画像の横幅を取得
height=getHeight();//画像の高さを取得


percentile=5; //任意の数値に変更可能。
lim=width*height*(1-percentile/100);


getHistogram(AryI, AryF, 256);
total=0;
Thr=0;

for (i=0;i<256;i++){
        total+=AryF[i];
        
        if (total>lim)
        {
                Thr=i;
                break;
        }
}



for(y=0;y<height;y++){
        for(x=0; x<width;x++){ 
                Intensity=getPixel(x,y);
                if(Intensity>Thr){
                        setPixel(x,y,0); 
                }else{
                        setPixel (x,y, 255); 
                }
        }
}
Percentile-2.macro

【まとめ】

二値化処理の手法のひとつであるPercentile法の実装の仕方が理解できたでしょうか?
今回のマクロのスクリプトには配列array[]やgetHistogram()、if文の中に条件を2つ書くなども含まれていて、より複雑な画像処理を実行するために非常に参考になると思います。
次回はここまでの小括としてマクロ言語の文法のまとめを紹介します。
30 件

関連する記事 こんな記事も人気です♪

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

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

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

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

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。
シリーズ4.ImageJマクロ言語を用いた画像解析~②二値化処理-2~

シリーズ4.ImageJマクロ言語を用いた画像解析~②二値化処理-2~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。
シリーズ6.マクロ言語を使った画像処理の応用編~ノイズ軽減① 空間フィルタ処理~

シリーズ6.マクロ言語を使った画像処理の応用編~ノイズ軽減① 空間フィルタ処理~

【記事の目標】 画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。 今回の記事から応用編としてさらに詳しく画像処理を学んでいきます。最初のテーマはノイズ軽減です。
ImageJ Plugin で数値計算をしてみる #5

ImageJ Plugin で数値計算をしてみる #5

非情報科学研究者 (特に生物系研究者) が ImageJ plugin を作るために超えるべき壁やTipsをまとめます。今回は、面積の平均値や中央値、分散を出力するためのコードをご紹介します。
湖城 恵 | 10,128 view

この記事のキーワード

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部