概要
- ターミナル上で処理した画像(一枚絵やスタック)をImageJで開いて確認することがよくある.流れ作業でやっていると,キーボードからマウスにいちいち持ち替えてD&Dで入力するのが面倒になってきた.
- そこで,ターミナルでコマンドを打って画像を開く仕組みを作った.
- これがあると,他の画像処理スクリプトに自動でImageJで開く処理を組み込まることもできるので,使い道が広そう.
作ったもの:コマンド化するためのバッチファイルとImageJマクロ
- こちら:https://github.com/xrm-bl/imagej-tools/tree/main/cui-open
- バッチファイルにPATHを通すことでコマンド
ij
で入力できるようになる. -
ij [file_path]
画像一枚を開く -
ij [dir_path]
画像スタックを開く -
ij [dir_path] v
画像をvirtual stackで開く -
ij [dir_path] [i] [j]
指定フォルダ内のi番目からj番目までの画像をスタックで開く -
ij [dir_path] [i] [j] v
指定フォルダ内のi番目からj番目までの画像をvirtual stackで開く - 画像の入力パスは絶対/相対両方OK(のはず)
解説
基本的な仕組み
- 画像一枚だけ開くのであれば,以下でOK
ImageJ.exe C:\hogehoge\hogehoge\image.tif
- スタック(ディレクトリ)を指定するには,ImageJマクロを作る.
open-macro.ijm
run("Image Sequence...", "open=[C:\\hogehoge\\image-dir-path] sort");
// sortはsort names numericallyオプションをオンにするという意味
- ImageJをマクロ付きで実行する.
ImageJ.exe -macro open-macro.ijm
- これで画像がスタック(Image sequence)で開かれる.
改良:virtual stackや画像番号の指定
- virtual stackで読み込むときはuseをつける."use (virtual stack)"
run("Image Sequence...", "open=[C:\\hogehoge\\image-dir-path] sort use");
- 画像番号はnumber=, starting=, increment=,で指定できる
run("Image Sequence...", "open=[C:\\hogehoge\\image-dir-path] number=4 starting=2 increment=1 sort");
改良:画像のパスを引数にする
- シンプルに入力パスのみを引数にする場合は,以下.
open-macro2.ijm
input = getArgument();
input = File.getAbsolutePath(input);
run("Image Sequence...", "open=[" + input + "] sort");
- パスを引数にして実行すればOK
ImageJ.exe -macro open-macro2.ijm C:\hogehoge\image-dir-path
改良:各種オプションを引数にする
- virtual stackにするかどうか,とか,いろいろオプションをつける(引数を増やす)場合は,工夫が必要.
- 理由① ImageJ macroは1個しか引数を受け付けてくれない.
- 理由② ImageJ macroの引数で半角スペースで空いた文字列以降は,別の引数として無視される.
- 理由③ コンマ記号は引数の区切り文字として認識される.(アットマークは区切り文字としては認識されない.)
- 今回は,以下の仕組みとした.
-
ij [dir_path] [i] [j] v
と入力されたら,バッチファイル内で[dir_path]@[i]@[j]@v
という文字列を作り,ImageJマクロに1個の引数として読み込ませる. - ImageJマクロ内で引数をアットマークで分割する(
argsArray = split(args, "@");
). - 分割した変数をオプションとして使う.
- これに加えて,作ったバッチファイルでは,引数の数に応じて場合分けや入力内容のエラー判定,相対パス→絶対パスへの変換,を行っている.