バイオ系だけどプログラミング始めました

ImageJ (Fiji)の使い方や Python でのプログラミングなどを、主にバイオ系の研究者・大学院生向けに書いていこうと思います。

ImageJ + Python の活用例:自動米粒解析プログラム

目次

米粒自動解析プログラムの概要

satoshithermophilus.hatenablog.com

上の記事で解説した米粒の解析を自動化した Jython script です。

  1. フォルダを選ぶダイアログを開き、

  2. フォルダ内の tif 画像をすべて読み込み上記の記事で解説したのと同様の解析をし、

  3. 米粒の数を表示して、二値化画像と米の 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. 解析条件(バックグラウンド減算や閾値決定のメソッド)を選ぶダイアログを出して、解析条件を変更できる機能

  2. 解析条件と解析した日付をcsvにして保存する機能 を付け加えてみましょう。

ヒント:1. は ij.gui.GenericDialog を使います。 2. は Pythoncsv モジュールと datetime モジュールを使えばできます。

*1:この際に回転させたり、Image Calculator で明るくしたり、暗くして少し別な画像にしてもいいかもしれません。