タイムラプス画像での視野のずれを補正する(ImageJ/Fiji)

(14/10/17 追記)ImageJ/Fijiのバージョンアップに伴ってこれまで自動的にインポートされていたclassがインポートされなくなった。もしうまく動かない場合は、scriptの最初に

from ij import IJ

from ij.measure import ResultsTable

と記述すると動くはず。

(追記ここまで)

 

タイムラプス撮影中に視野がずれてしまった場合にそれを補正する方法。
マクロでもできるけど、今回は練習がてらにFijiにインストールされているPython(Jython)を使ってやってみた。

まず、視野のずれとともに移動してる適当な物体を選びその座標を計測(単位はPixelで)。今回は対象細胞の重心をAnalyze Particlesを用いて計測。

対象データのWindowをアクティブにして、Script Editorにて

 

#対象データのImagePlusおよびImageStackオブジェクトを取得
imp = IJ.getImage()
stack = imp.getImageStack()

#計測したリザルトが格納されたオブジェクトを取得
table = ResultsTable().getResultsTable()

#計測した基準点の座標リストを取得
x = table.getColumn(table.getColumnIndex('X'))
y = table.getColumn(table.getColumnIndex('Y'))

#初期位置
x0 = x[0]
y0 = y[0]

for i in xrange(1, imp.getStackSize()+1):
#今回のデータは3チャンネルのComposite Imageなので
#3枚おきに初期位置とのずれを計算する
	if i % 3 == 1:
		offset_x = x0 - x[i / 3]
		offset_y = y0 - y[i / 3]

#画像オブジェクトを取得しオフセット分だけずらす
	ip = stack.getProcessor(i)
	ip.translate(offset_x, offset_y)

と記述し、RUN。

これだと元のデータが変更されるので、元のデータを残したければ、impをduplicateしてそちらをいじればいいかな。