Wet研究者がコスパ良く手抜きをするためのimageJマクロ

Wet研究者がコスパ良く手抜きをするためのimageJマクロ

日々苦戦しながらimageJ(というかFiji)と格闘して数年経ちました。Wetの研究者...というか過去の僕、が適度に手抜きをするにはこのへんわかってればいいんじゃね?というところが見えてきたので、それとなくimageJマクロのコスパの良さげな使い方を備忘録的に書いてみます。

コンセプトは、マニュアルと自動化の間を狙ったマクロを作って手抜きする、です。Open/Closeはマニュアルでやるからフィルターを順番にかけるのを機械にやってもらう、とか、逆に2値化のthresholdはマニュアルで決めるけども画像のOpen/Save/Closeは機械におまかせ、みたいなイメージ。


1. 開いた1枚の画像に自動で操作をかける

まず最初の目標は「画像のOpen/Save/Closeは自分でやるから操作は機械にやってもらう」こと。
慣れてる人にとったら基本のキにすらならないんだろうけど一応。

具体的な例があったほうがいいと思うので、デモ画像を用意してみた。

蛍光in situ(FISH)の顕微鏡写真。この画像、顕微鏡が自動stitchingしているものなのでサイズが超大きくて扱いにくい+3色重なりの.jpgなので解析しにくい。
なので、
- 縦横それぞれ1/10に縮小
- 縮小したもののRGBのチャネルに分けて
- Redチャネルだけtiffで保存
をしてみます。

まず、それぞれの操作に対応するコマンドを Built-in Macro Functions から探します。
というのは最高にめんどくさいのでRecorderからコピペする。

Plagins > Macros > Record... でRecorderをOpen。
一度手動で自動化したい操作を手動でポチポチかけるとこんな感じで出る。

ので、Createボタンをポチッと押してマクロ編集画面へ。
ちょこっと解説を足したりしてます。

この編集画面はPlagins > New > Macroでも新規に立ち上げられる

コピペしたマクロを機械用に編集。
- Open、Save、Closeはマニュアルでやるのでその部分は消す
- Recorderはウィンドウの選択は反映してくれないのでそこを足す。
  selectWindow(“window名”); は覚える価値あり
- run(“Close”); はどのウィンドウを指しているかわかりにくいのでclose(“window名”); に書き換えて閉じるウィンドウを明確化
あたりができれば充分かと。こんな感じ。

▲ Code 1(コードは最下部に置いてあります)

あとは好きな画像を手動でOpen→マクロのRunボタンでこれがこうなる。

このあとは保存をマニュアルで。次の画像があるときは開いた画像を全部閉じてから同じ操作をする。

ぽちぽちクリックしていくより早くて正確に終わります。
なにより、あの操作やったっけ...?最初からやるか...がなくなるのが精神衛生上たいへんよろしい。

さて、このあたりで、
「これはこれでラクだけどひとつひとつ名前をつけて保存はめんどい」
という心の声が聞こえてくるので、これを↓でなんとかしてみる。


2. 開いた複数の画像のすべてに自動で操作をかける

数が多くなると開いて保存するのさえうっとおしい。
例えば、「全部で50枚画像があるんだけど、そのうち選んだ22枚だけ右に90°傾けたい」みたいなとき。

これはこんな感じで解決できるはず。

▲ Code 2-1

lines 1-6 が操作を繰り返しさせるやつ、lines 8-15 がさせたい操作。
操作が終わった画像を必ずCloseで閉じることが必要。

今回は、傾けたい画像を全部開いた状態でRunを押すだけ。
他の操作をさせたいときはlines 11-13 を書き換えればOK。


...さて、この操作、line 12 の run("Save"); だと上書き保存されます。
上書き保存、オリジナルの画像が残らないのであまりよろしくない。

これ回避は
- オリジナルの画像を別のフォルダに避難させおく
- 名前をつけて保存、のマクロを書く
のどちらかでやってます。

前者は見るからにその場しのぎ、って感じですが僕は好きです。
何から何までimageJの中だけで考える必要ないし。

一方で、後者で対策しないといけないときもありまして、
- 元画像があったフォルダ内に別名で保存
- マクロをRunするたびに別の名前で保存されること
を満たすように書いたものがあります。
2つめの条件は、毎回同じ名前で保存だと2回目のRunの結果が1回目のRunの結果に上書き保存されてしまうのでそれを避けるものです。

ということで、
別名で保存するときの保存名を:【元画像の名前】_【Rotated(任意の文字列)】_【タイムスタンプ】【.jpg(任意の拡張子)】
にしてみたのがこちら。

▲ Code 2-2

lines 1-3 でマクロ開始時間のタイムスタンプを取ります。1回のRunにつき1個だけ発行されます。
lines 5-10 は上と同じ。
lines 12-28がさせたい操作。ちょっとくわしく見てみると、
line 15 が元画像の保存フォルダの取得
lines 16-18 で元画像の拡張子の前までのファイル名の取得(beer.jpgのbeerの部分)
line 20 がさせたい操作。
line 22 で保存する名前を決めて(_Rotated_ や.jpgは好きに変える)
line 24 で名前をつけて保存(Jpegの部分は好きに変える)
line 26 で閉じる
なのでへんなことはしてないはず。
line 23はなくてもいいけど操作が増えてくるとあったほうがいい気がしてる。

もちろん改変改造ご自由に...!!!


3. 指定したフォルダの中にあるすべての画像に自動で操作をかける

最後は、「画像を開くのすら面倒」「フォルダ内の画像全部に同じ操作をしたい」の解決をします。

- 元画像のフォルダを自分で選べるように
- 保存先のフォルダを自分で選べるように
で作ったコードはこんな感じ。

▲ Code 3

さっきと違うのは2箇所だけ。
lines 6-10 が開くフォルダと保存先フォルダを選択するところ。
line 20 が開くフォルダの中身を順番にOpenしていくところ。



全体的にもっといい方法や書き方があるんだろうけど、これでやりたいことできてるからいいか、のラインがこのへんなのかなと思ってます。
エレガントで汎用的な別の選択肢があればぜひ知りたいですが...!!!

以下、コードです。
noteはこういうの向いてないなぁ...

------------
Code 1
Code 2-1 - 上書き保存のやつ
Code 2-2 - 名前をつけて保存のやつ
Code 3


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
Twitter → @Kd_Gn