「【ImageJ】ImageJマクロを使う」シリーズでまとめてきた知識を使って、細胞を計数するマクロを組んで動かしていきましょう。
マクロの内容としては、
- フォルダを選択
- 結果を保存するフォルダを作る
- 画像を開いてプラグインであるInteractive Watershedで2値化
- 領域を計数
- 計数結果をcsvファイルとして保存する
です。
組んできたImageJマクロの振り返り
組みたいマクロの概要は、フローチャートを書いてまとめています。
フローチャートの書き方はこちらの記事をご覧ください。
それぞれの関連記事は、
- フォルダを選択
- 結果を保存するフォルダを作る
- 画像を開いてプラグインであるInteractive Watershedで2値化・領域を計数
- 計数結果をcsvファイルとして保存する
- 解析を繰り返し処理する
です。
今まで書いてきたコードを組み合わせて最終的な細胞計数用のマクロを組んでいきましょう。
Interactive Watershedの解析をfor文に入れる
「【ImageJ】ImageJマクロを使う#9」では、プラグインであるInteractive Watershedをマクロで動かす方法をまとめました。
これをfor文の中に入れて、画像の数だけ繰り返し処理できるようにしていきましょう。
ImageJマクロのfor文とif文に関してはこちらの記事にまとめています。
書いたコードはこちら、
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_results"); File.makeDirectory(resultFolder); //フォルダ内のファイルリストを取得する filelist = getFileList(chooseDir); //for文で繰り返し処理する 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"); run("H_Watershed", "impIn=[name] hmin=12.0 thresh=24.0 peakflooding=100.0 outputmask=true allowsplitting=true"); //解析方法の設定 run("Set Measurements...", "area mean redirect=None decimal=3"); run("Analyze Particles...", "size=50-Infinity display exclude clear include summarize add"); //Summaryウィンドウの結果を保存 selectWindow("Summary"); saveAs("Results", resultFolder+newname+".csv"); close(newname+".csv"); //画像ウィンドウを消す close(); close(name); //ResultsとROI Managerのウィンドウを消す close("Results"); close("ROI Manager"); } |
書いたコードを動かしてみましょう。
という感じで解析ができるようになりました。
おまけ:サブフォルダがある場合、ない場合
上のコードだけで解析して行っても良いのですが、下の図のようにサブフォルダを作ってその中に画像が入っている場合もありますよね。
それを一気に解析できた方が何かと使い勝手が便利だったりします。
そこでサブフォルダがある場合には、サブフォルダ①を開いて中の画像を解析して、次にサブフォルダ②を開いて中の画像を解析して...ということができるようにしてしまいましょう。
まずは選んだフォルダにサブフォルダがあるかどうかを判定して、サブフォルダがある場合とない場合の条件分岐を書いていきましょう。
サブフォルダがあるかどうかをif文で判定する方法はこちらの記事で紹介しています。
サブフォルダがある場合はサブフォルダの個数回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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
//解析をする画像が入っているフォルダを選ぶ showMessage("Select Analyze Folder"); chooseDir = getDirectory("Choose a Directory"); //カウントの結果を保存するフォルダを作る a = split(chooseDir, "/"); resultFolder = replace(chooseDir, a[a.length-1], "count_results"); File.makeDirectory(resultFolder); //フォルダ内のファイルリストを取得する list = getFileList(chooseDir); if (endsWith(list[0], "/")){ print("サブフォルダがあります"); for (j = 0; j < list.length; j++) { analyzeDir = chooseDir+list[j]; //新しい変数にサブフォルダのパスを入れる //print(analyzeDir); filelist = getFileList(analyzeDir); //サブフォルダ内のファイルリストを取得する //Array.print(filelist); sub = split(list[j],"/"); //サブフォルダの名前を取得する //Array.print(sub); sub = sub[0]+"_"; //サブフォルダの名前に"_"をつけたもの print(sub); //for文で繰り返し処理する for (i = 0; i < filelist.length; i++) { //画像を開く open(analyzeDir+filelist[i]); //解析結果の名前をつける name = getTitle(); extension = indexOf(name, "."); title = substring(name, 0, extension); newname = sub + title + "_count_result"; //解析のプログラム //画像を8-bitにする run("8-bit"); run("H_Watershed", "impIn=[name] hmin=12.0 thresh=24.0 peakflooding=100.0 outputmask=true allowsplitting=true"); //解析方法の設定 run("Set Measurements...", "area mean redirect=None decimal=3"); run("Analyze Particles...", "size=50-Infinity display exclude clear include summarize add"); //Summaryウィンドウの結果を保存 selectWindow("Summary"); saveAs("Results", resultFolder+newname+".csv"); close(newname+".csv"); //画像ウィンドウを消す close(); close(name); //ResultsとROI Managerのウィンドウを消す close("Results"); close("ROI Manager"); } } }else{ print("サブフォルダはありません"); analyzeDir = chooseDir; filelist = getFileList(chooseDir); sub = ""; } //for文で繰り返し処理する for (i = 0; i < filelist.length; i++) { //画像を開く open(analyzeDir+filelist[i]); //解析結果の名前をつける name = getTitle(); extension = indexOf(name, "."); title = substring(name, 0, extension); newname = sub + title + "_count_result"; //解析のプログラム //画像を8-bitにする run("8-bit"); run("H_Watershed", "impIn=[name] hmin=12.0 thresh=24.0 peakflooding=100.0 outputmask=true allowsplitting=true"); //解析方法の設定 run("Set Measurements...", "area mean redirect=None decimal=3"); run("Analyze Particles...", "size=50-Infinity display exclude clear include summarize add"); //Summaryウィンドウの結果を保存 selectWindow("Summary"); saveAs("Results", resultFolder+newname+".csv"); close(newname+".csv"); //画像ウィンドウを消す close(); close(name); //ResultsとROI Managerのウィンドウを消す close("Results"); close("ROI Manager"); } |
コード自体がちょっと長くなってしまいましたが...
15, 16行目で中にサブフォルダがあるかどうかを判断しています。
18行目で、サブフォルダの数を"list.length"で取得、
19行目で新しい変数である"analyzeDir"にサブフォルダのパスを入れています。
21行目でサブフォルダ内のファイルリストを取得、
23-26行目にサブフォルダの名前を取ってきて解析ファイルの先頭につけられる形にしています。
62行目からはサブフォルダがない場合の操作。
サブフォルダがない場合は、今まで組んできたコードがそのまま動くようにしています。
サブフォルダがある場合と同じ解析プログラムを動かすために、変数を書き換えています。
もっと短くかっこよくするためには、解析コードを関数にするのが良いかと思いますがとりあえず動くことが大事だと思っているので、今回はこのままにしました。
完成!マクロを動かす
コードが完成したので、動かしてみておしまいにしたいと思います。
完成!
次回は、組んだマクロの保存方法についてまとめます。
ImageJを立ち上げたらいつでも使えるようにしておきましょう。