何とか発表も終わり、ようやく実験ができるかと思いきや、たまっていたデータ整理に追われています。
というかデータ整理をするのが面倒になって、自動にやってくれるプログラムを作っていたのですが、先週の金曜日から始めてようやく何とか動くものができました。
まあプログラムを作っていた1/10くらいの時間でデータ整理は終わるはずだったんですが(;´Д`A ```
私は共焦点顕微鏡(Nikon)を使って三次元画像を撮っているのですが、印刷などのために二次元に投影した“スタック画像”を作らなければなりません。また、私が顕微鏡で撮っているサンプルは大きいため、一視野では収まりません。そこで視野をずらしながら何枚かに分けて撮って、後からphotoshopのphotomerge panoramaという機能を使って張り合わせて“パノラマ写真”を作っていました。そこで、①元の三次元画像を二次元にスタックしてtif形式で保存し、②それらを一枚のパノラマに張り合わせて保存する、という操作を自動化することを試みました。
需要はほぼゼロに等しいとは思いますが、ようやくできて興奮しているのでupしてしまいます。
また、プログラムはCを昔に独学でかじったことがあるだけなのでかなり変だと思いますが、ご容赦くださいませ。
ともかく備忘録&(ほとんどいないとは思いますが)同じような単調作業をやっている人のために以下に方法と作ったプログラム(マクロ)を書いておきます。
まず、
ImageJ
をベースにしたフリーソフト、
Fiji
をダウンロードします。
で、Nikonの画像は特殊なので、開くためにIcs_Opener.jarをダウンロードして、Fijiのpluginsフォルダに置いてください。
また、一番下のマクロをコピペして、Fijiのmacroフォルダに置いておきます。
次に、一枚に張り合わせたい画像(の元ファイル)を一つのフォルダにまとめ、それらをあるフォルダの中にまとめて置いておきます(図1)。
で、Fijiを起動し、Plugins -> Macros -> Runで先ほど保存したマクロファイルを指定します。
すると、作業フォルダを聞いてきますので、大元のフォルダ(図1ではtest)を指定すればokです。
あとは自動的にフォルダ内をスキャンして、パノラマ画像を(フォルダ名を名前にした)tif形式で保存してくれます(図2)。
*******以下マクロです*********************************************************
dir = getDirectory("Choose a Directory"); //作業フォルダを選択
folderlist = getFileList(dir);
for(i=0; i<folderlist.length; i++){
//print(folderlist[i]);
FolderName = folderlist[i]; //フォルダ情報をすべて取得
Name = File.getName(dir + FolderName);
list = getFileList(dir + FolderName); //作業フォルダ内のファイル情報をすべて取得
count=0;
for(j=0; j<list.length; j++){
if(endsWith(list[j], "ics")){ //icsファイルの時のみ以下の操作を行う
run("Open...", "path=" + dir + FolderName + list[j]);
name = my_nameWithoutExtension(list[j]); //拡張子を取り除く
selectWindow(name + " ch: 2"); //488のチャネルの画像を選択
run("Z Project...", "start=1 stop="+nSlices+" projection=[Max Intensity]");
run("8-bit");
saveAs("Tiff", dir + FolderName + name);
//run("Close");
for(k=1; k<5; k++){ //stack前の画像を閉じる
selectWindow(name + " ch: "+k);
run("Close");
}
if(count==0){
name0=name;
}
else if(count==1){
run("2D Stitching", "first=["+name0+".tif] use_channel_for_first=[Red, Green and Blue] second=["+name+".tif] use_channel_for_second=[Red, Green and Blue] use how=5 create create Method=Max. Intensity fused=[Merge-"+count+".tif] compute_overlap x=0 y=0");
selectWindow(name0+".tif");
run("Close");
selectWindow(name+".tif");
run("Close");
}
else{
run("2D Stitching", "first=["+name+".tif] use_channel_for_first=[Red, Green and Blue] second=[Merge-"+count-1+".tif] use_channel_for_second=[Red, Green and Blue] use how=5 create Method=Max. Intensity fused=[Merge-"+count+".tif] compute_overlap x=0 y=0");
selectWindow(name+".tif");
run("Close");
selectWindow("Merge-"+count-1+".tif");
run("Close");
}
count+=1;
//print(count);
}
}
selectWindow("Merge-"+count-1+".tif");
saveAs("Tiff", dir + Name);
print("ok");
run("Close");
}
//拡張子を取り除く
function my_nameWithoutExtension(str){
n = lastIndexOf(str, ".");
if(n>=0) rstr = substring(str, 0, n);//拡張子が存在する場合
else rstr = str;//"."拡張子が存在しない場合
return rstr;
}
*****************************************************************************