Translate

2019年10月28日月曜日

Logウィンドウ以外にprintの出力を出す

printは普通に使うとLogウィンドウに結果を出力する。
Logウィンドウとは違うウィンドウに結果を出力するには、
print(textTitle, string);
を使う。
textTitleは
run("Text Window...", "name=textTitle width=80 height=20 menu");
のようにして作成したテキストウィンドウを指す。このとき、textTitleは"[]"で囲まれている必要がある。
textTitle = "[test text]";
run("Text Window...", "name=" + textTitle + " width=80 height=20 menu");
print(textTitle, "Hello mac\n");
print(textTitle, "DomDom burger");

とかいう感じ。printはそのままでは改行してくれないので、複数行にするときは改行コードを入れておく。


2019年10月21日月曜日

ImageJのデバッグ機能

ImageJのMacro editorは普通のテキストエディタで、予約語や変数をハイライトしてくれないし、インデントも自動で設定はしてくれない。
マクロを書くならScript EditorがあるFijiを使うのが断然楽だ。だが、Fiji使いでも普通のImageJは別途入れておいた方が良い。
ImageJのMacroEditorには、Debug機能がついている。

プログラムは常にバグを含んでいる。構文ミスなどのエラーは修正が容易だが、エラーは出ずにでもなんか動作がおかしい、というバグは厄介である。
バグを修正することをデバッグというが、ImageJのMacroEditorにはその機能がある。EditorのDebugメニューから使うことができる。

  • Debug Macro ... デバッグモードに入る
  • Step ... 1行ずつ実行
  • Trace ... ゆっくり実行
  • Fast Trace ...速度をあげて実行
  • Run ... 普通に実行
  • Run to Insertion Point ... カーソル位置まで実行(カーソル位置の文は実行しない)
  • Abort ... やめる
となっている。デバッグモードになれば、変数の中身も別ウィンドウで確認することができる。

作成はFijiでDebugはImageJで、という感じで使いたい(Fijiでできれば話は早いのだが、デバッグ機能の実装が難しい、というような話を聞いた)。

2019年10月16日水曜日

輝点の検出を楽に行う -macro-

以前、輝点の検出を楽に行うとしてpluginからMaximumFinderを使う方法を記述したが、Macroからは、FindMaximaを使う。
run("Find Maxima...", "prominence=10 output=[Point Selection]");
(最新のImageJバージョンは、prominenceだが、ちょっと前のバージョンまではtoleranceというパラメータだった)。
これだけでPointRoiを作ってくれる。
このPointRoi位置の輝度の情報は、Measure...をすればResults Tableとして得ることもできるが、Macro内でアクセスする場合は、
getStatistics(area, mean, min, max, std, histogram);
で簡単に取得できる。(このコマンドを実行すれば、各要素が変数area, mean, min, max, histogramに格納される。histogramは配列)

さらに、PointRoiの個々の座標は、
Roi.getCoordinates(xpoints, ypoints);
とすれば、各座標はxpoints、ypointsに配列として格納できるので、

for (i = 0; i < lengthOf(xpoints); i++) {

 print(xpoints[i], ypoints[i]);

}
とでもすれば、各座標を取り出すことができる。

2019年10月11日金曜日

public static void mainとresourceへのアクセス

Public static void main

Eclipseでmavenを使ってjarファイルのpluginを作る場合、動作確認はjarファイルをImageJのpluginsフォルダに移して実行、ということが多い。作ってはImageJを立ち上げなおして、というのは結構面倒臭い。
そこで、public static void main(String args[])を作っておけば、EclipseのRunからJava applicationとして簡単にテストすることができる。
ijをインスタンスしなくても、ImageJのクラスは普通に使えるので、特にplugin filterを作る場合などに便利。
import java.net.URI;
import java.net.URISyntaxException;

import ij.IJ; import ij.ImagePlus; import ij.plugin.filter.PlugInFilter; import ij.process.ImageProcessor;
public class Hoge implements PlugInFilter {
@Override public int setup(String arg, ImagePlus imp) { // TODO Auto-generated method stub return DOES_ALL; }
@Override public void run(ImageProcessor ip) { // TODO Auto-generated method stub
}
public static void main(String[] args) { // TODO Auto-generated method stub URI img; try { img = ClassLoader.getSystemResource("test.tif").toURI(); ImagePlus imp = IJ.openImage(img.getPath()); Hoge hogehoge = new Hoge(); hogehoge.setup("", imp); hogehoge.run(imp.getProcessor()); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); }
}

}

Hogeのオブジェクトを作り、setupでImagePlusを、runでImageProcessorを送ることができる。

Resourceフォルダへのアクセス

テスト用の画像データは、resourceフォルダに入れておく。resourceフォルダに入れたファイルは、以下のようにしてアドレスを取り出す。
URI img = ClassLoader.getSystemResource("test.tif").toURI();
ImagePlus imp = IJ.openImage(img.getPath());

これで開発はかなり楽になる。

2019年10月2日水曜日

(小ネタ)pluginからmacroに値を渡す

PluginからMacroに値を渡す方法がImageJのメーリングリストにあった。
How to return a value from a plugin to a macro?
ここのMicheal schmidさんの投稿にあるように、
plugin側では、
public class My_Plugin extends ... {

     static double myResult;

     void run(ImageProcessor ip) {

        ...

         myResult = ...;

     }

     static String getResult() {

         return myResult.toString();

     }
}
としておき、macro側では
myResult = parseFloat(call("My_Plugin.getResult"));
とすれば渡せると思いきや、これを実行すると、getResultなんてありませんよ、とエラーがでると思う。
static String getResult() {...}
を、
public static String getResult() {...}

にしないと、外部からアクセスすることができないから。ちなみにテキスト以外は無理ぽいので、複数の値を渡すときは、カンマ区切りなどにしておき、macro側で、
items = split(myResult, ",");

として要素を取り出せばよい。 Pluginにしかできないことも多々あるが、macroの方が手軽なので、できるだけmacroで作りつつ、外部ライブラリを使いたい場合などはpluginを最小限利用するのが良い。