「ImageJマクロを使う」シリーズでは、ImageJを使って生命科学系の画像解析をするにあたって必要な知識をまとめていきます。
今回は、マクロを使って選択したディレクトリ内のフォルダを順番に開いていくをできるようにしていきます。
基本的なfor文の使い方、作り方がマスターできれば、フォルダ内に画像データがどんなにたくさんあっても一気に解析できるようになります。
「細胞の核を数える」シリーズで描いたフローチャートの「ココ」の部分をやっていきます。
for文の基本的な構造
同じ作業を繰り返し行うときに、プログラミングでは「for文」を使います。
今回の場合は、解析する対象フォルダ内にあるファイルを開く(更に言えば解析作業をする)をfor文を使ってしていきます。
まずは、ImageJマクロのfor文の構造を簡単におさらいしましょう。
今回やりたいのは...
フォルダ内の画像ファイルの数だけ解析の繰り返し処理をする、です。
for文の条件部分を言語化するとこんな感じになります。
詳しいImageJマクロのfor文については、こちらの記事にもまとめています。
for文を書いていく
基本のfor文を準備する
個人的にfor文を書くときに重要だと思うのが、目的の回数だけ繰り返し処理ができるかどうか?です。
基本のfor文を準備するときも、何回繰り返し処理をしたいのか?を考えなから書くのが良いかと思います。
今回はフォルダ内にある写真のデータの数だけ繰り返し処理をしたいので、「条件」の部分をフォルダ内のファイルリストの長さにします。(フォルダ内に写真以外のファイルがないことが前提です)
では、for文を書いてみましょう。
ここでのポイントは、for文の二番目の引数の「条件」の部分。
ファイルリストの長さにすることで、ファイルの数だけ繰り返し処理することができます。(ここでは、フォルダ内に解析する画像データだけが入っていることが前提となります)
for文が回るかどうかを試すときには、"print"関数を使うと便利です。
今回はフォルダ内に入っているファイルの名前をLog画面に出力するようにしています。
基本のfor文が書けたので、for文の中に解析用のマクロを入れていきます。
サブフォルダがある場合は、サブフォルダを開いてからその中のファイルリストを取得することになるので、入子状態のfor文を書くことになるので注意が必要です。
2つのfor文を組み合わせる方法はこちらの記事にまとめています。
ファイルを開いて解析データを保存するマクロを作る
ファイルを開いて解析データを保存するマクロはこちらの記事で作成しました。
上の記事では、
という解析を行なっています。
このコードと基本のfor文を組み合わせていきます。
コードはこんな感じになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
//解析をする画像が入っているフォルダを選ぶ showMessage("Select Analyze Folder"); chooseDir = getDirectory("Choose a Directory"); //カウントの結果を保存するフォルダを作る a = split(chooseDir, "/"); resultFolder = replace(chooseDir, a[a.length-1], "count_rsults"); File.makeDirectory(resultFolder); //フォルダ内のファイルリストを取得する filelist = getFileList(chooseDir); //繰り返し処理をスタート for (i = 0; i < filelist.length; i++) { //画像を開く open(chooseDir+filelist[i]); //解析結果の名前をつける name = getTitle(); extension = indexOf(name, "."); title = substring(name, 0, extension); newname = title + "_count_result"; //解析のプログラム //画像を8-bitにする run("8-bit"); //画像を2値化する setAutoThreshold("Otsu dark"); setOption("BlackBackground", false); run("Convert to Mask"); //大きな領域を分割する run("Watershed"); //解析方法の設定 run("Set Measurements...", "area mean redirect=None decimal=3"); run("Analyze Particles...", "size=100-Infinity display exclude clear include summarize add"); //Summaryウィンドウの結果を保存 selectWindow("Summary"); saveAs("Results", resultFolder+newname+".csv"); } print("Macro Finished"); |
では、実際にマクロを動かしてみるとどうなるかやってみましょう。
解析したデータはどこに入っているかというと...
画像が入っているフォルダと同じ階層に作った"count_results"フォルダにcsvの形で入っています。
動画を見ると分かるとおり、マクロを動かすとウィンドウが大変なことになっていることがわかります。
マクロが終わって閉じなければいけないウィンドウが散らかっているのはげんなりしますよね...
マクロを使って画面を閉じるコードを入れておきましょう。
画面を閉じる関数は"close()"。
追加したコードはこちら
コードを追加したマクロを動かしてみます。
マクロが終わった後に、ウィンドウがスッキリしました。
次回は、Interactive Watershedの引数を変数を使ってfor文に入れていく方法をまとめます。