ImageJのコマンドに上端と下端に閾値のある一定範囲の明度で区切られたマスクを作成する、Thresholdコマンドがあります。
メニュー→ [Image]→ [Adjust]→ [Threshold]
これを Pythonのスクリプトで書くにはどうしたら良いでしょうか? これについては以下のページにサンプルスクリプトが出ています。
この、Threshold to create a mask (Binary)下にある、Lower and Upper Threshold Value のサンプルについて解説をつけていきます。
- # an example with lower and upper threshold values, 100 and 125.
- from ij import IJ, ImagePlus
- from ij.process import ImageProcessor
- from ij.plugin.filter import ThresholdToSelection
- imp = IJ.getImage()
- imp.getProcessor().setThreshold(100, 125, ImageProcessor.NO_LUT_UPDATE)
- roi = ThresholdToSelection.run(imp)
- imp.setRoi(roi)
- maskimp = ImagePlus("Mask", imp.getMask())
- maskimp.show()
例によって、緑色の字は、任意に変えることのできる名前や値です。青字は、選択肢の中から選ぶべきパラメータです。
1行目はコメント欄ですが、2~4行目は必要なライブラリを読み込んでいます。
6行目、IJに関しては、リファレンスに次のように説明されています。
"This class consists of static utility methods."
つまり、ImageJのユーティリティに関するメソッドを集めたクラスで、基本的なクラスです。getImage() は、アクティブなイメージを取得するメソッドで、imp = IJ.getImage() で、impという名の imagePlus オブジェクトに今アクティブなイメージを取得しています。ただ、前にも指摘しましたように、アクティブなイメージを別のポインタに格納しているわけではなく、アクティブなポインタに、いわば imp というエイリアス(別名)をつけただけなので、アクティブなイメージを閉じてしまうと、imp もなくなってしまうことに注意してください。
7行目ですが、getProcessor() メソッドを通して impに対し、setThreshold というImageProcessorのメソッドを実行します*1。setThreshold はリファレンスに次のように出ています。
setThreshold(double minThreshold,
double maxThreshold,
int lutUpdate)
RED_LUT=0, BLACK_AND_WHITE_LUT=1, NO_LUT_UPDATE=2, OVER_UNDER_LUT=3
Constructor and Description |
---|
ImagePlus()
Constructs an uninitialized ImagePlus.
|
ImagePlus(java.lang.String pathOrURL)
|
ImagePlus(java.lang.String title,
java.awt.Image image)
Constructs an ImagePlus from an Image or BufferedImage.
|
ImagePlus(java.lang.String title,
ImageProcessor ip)
Constructs an ImagePlus from an ImageProcessor.
|
ImagePlus(java.lang.String title,
ImageStack stack)
Constructs an ImagePlus from a stack.
|
*1:なお、getProcessor()の ( )内に何も記述がないので、現在アクティブなImageProcessorに、setThresholdが有効なグレースケール画像が含まれているか、あるいは1枚しかimageProcessorのスライス (チャンネル) がないimagePlusオブジェクトが前提されていると思われます。
*2:ところで、ここでこういう疑問は沸きませんか?そもそも閾値の設定は imageProcessorに対して行っています。ですのでここでの引数は imagePlus でなく imageProcessor でも良いのではないか、と。でどうもレファレンスを見ると、確かに ThresholdToSelection.run( ) の引数としてimageProcessor も取れるようなのですが、引数として入れてみると、ちゃんと 注目範囲(ROI)を作ってくれません。いろいろトライアンドエラーを行った結果分かったことは、imageProcessor を引数としてROIを作るためには ThresholdToSelection().convert( ip ) を使うようです。※ ip は任意の名前のimageProcessor
*3:なお、setRoi, getMask メソッドは imageProcessor にもあるようです。