ImageJ + Python の活用例:自動米粒解析プログラム
目次
米粒自動解析プログラムの概要
satoshithermophilus.hatenablog.com
上の記事で解説した米粒の解析を自動化した Jython script です。
フォルダを選ぶダイアログを開き、
フォルダ内の tif 画像をすべて読み込み上記の記事で解説したのと同様の解析をし、
米粒の数を表示して、二値化画像と米の Roi と解析結果を保存する。
というプログラムになります。
また詳細に解説を書く予定ですが、とりあえず ImageJ + Python でできることの例としてアップします。
サンプル画像 rice.tif を save as で違う名前で複数自分のPCに保存して*1、このコードを ImageJ Fiji の text window にコピペして、Language > Python を選択して実行してみましょう。やり方はこちらを参考に。
ImageJ Fiji + Python で画像解析プログラムを書こう(前編) - バイオ系だけどプログラミング始めました
コード
from ij import IJ from ij.plugin.frame import RoiManager from ij.plugin.filter import ParticleAnalyzer, BackgroundSubtracter, EDM from ij.measure import ResultsTable from ij.io import DirectoryChooser import os def RiceAnalyzer(imagefilepath): # open image, set roi manager and set result table imp = IJ.openImage(imagefilepath) rm = RoiManager().getInstance2() rt = ResultsTable() # Subtract Background bs = BackgroundSubtracter() ip = imp.getProcessor() bs.rollingBallBackground(ip, 40.0, False, False, False, True, True) # duplicate imp, make binary and run watershed binimp = imp.duplicate() IJ.setAutoThreshold(binimp, "Default dark") IJ.run(binimp, "Make Binary", "thresholded remaining") EDM().toWatershed(binimp.getProcessor()) # Analyze particles IJ.run("Set Measurements...", "area centroid fit redirect=None decimal=3") PA = ParticleAnalyzer(8, 0, rt, 5, 1000, 0.1, 1.0) PA.setRoiManager(rm) PA.analyze(binimp) IJ.log("Number of rice particle = "+str(rm.getCount())) # save results savefilepath = imagefilepath[:-4]+"_" rm.runCommand("Save", savefilepath + "Roi.zip") rt.saveAs(savefilepath + "Results.csv") IJ.saveAs(binimp, "bmp", savefilepath + "AnalyzedResult.bmp") # close roi manager, results table and images rm.close() rt.reset() imp.close() binimp.close() # Open dialog to choose folder srcDir = DirectoryChooser("Choose directory").getDirectory() IJ.log("directory: " + srcDir) # search tif file in srcDir and analyze tif file by RiceAnalyzer() for root, directories, filenames in os.walk(srcDir): for filename in filenames: if filename.endswith(".tif"): filepath = os.path.join(root, filename) IJ.log("Image file path: " + filepath) RiceAnalyzer(filepath) IJ.log("finish!")
練習問題
慣れてる人は、プログラムをいじって、
ヒント:1. は ij.gui.GenericDialog を使います。 2. は Python の csv モジュールと datetime モジュールを使えばできます。
Python の入門にはこちらの本がおすすめです。プログラミング自体が初心者の人に向けて詳しく書かれています。
ImageJ の使い方については「ImageJで始める画像解析」という本が良書です。画像データの基本などの初心者向けの内容から入り、生物系の顕微鏡画像の具体的な定量解析や、有用なプラグインの活用法まで書いています。
*1:この際に回転させたり、Image Calculator で明るくしたり、暗くして少し別な画像にしてもいいかもしれません。