こんにちは。yu3xxです。
マクロ作成についてご質問をいただきましたので、こちらから回答いたします。
ご質問内容
親フォルダ内の複数の子フォルダに含まれている画像を、子フォルダごとに平均化するマクロを作りたい。
作成したマクロの概要
① 「作業したい親フォルダ」と、「平均化後の画像を保存したいフォルダ」を選択
② 親フォルダ内に、子フォルダが何個含まれているかチェック
③ 子フォルダごとに、処理「opeLoop」を繰り返す
④ 「opeLoop」の中身:2次元画像を1次元配列「TEMP」に直してから、配列「GOUKEI」に加算していく。最後に「GOUKEI」を画像枚数で除算して平均化。それを再び2次元画像に直して保存。
⑤ 保存ファイル名は、子フォルダの名前をそのまま使用
作成したマクロのルール
① 子フォルダの中にさらにフォルダ(孫フォルダ)があるとエラー
② 画像はグレースケールのみ。8bit,16bit,32bitなんでもOK。カラーは別の処理が必要
③ 画像枚数は何枚でもOK。子フォルダごとに違ってもOK
④ 画素数(タテヨコ)は子フォルダ内の画像が全て揃っていればOK。子フォルダ内が揃っているなら、子フォルダごとに違う画素数でもOK。
マクロコード
//Co_Folder_Average.txt
var GOUKEI;
//Do something for selected folder
showMessage("Select Open Folder");
opDir = getDirectory("Choose a Directory");
print("Processing :",opDir);
showMessage("Select Save Folder");
saveDir = getDirectory("Choose a Directory");
print("Save to :",saveDir);
listOp = getFileList(opDir);
//main operation
for(m=0; m<listOp.length; m++){
openDir = opDir + listOp[m];
print("openDir : ",openDir);
opeLoop();
}
print("oshimai");
//--------------------------------------------------------
//Define opeLoop
function opeLoop(){
list = getFileList(openDir);
for(i=0; i<list.length; i++){
open(opDir + listOp[m] + list[i]);
w = getWidth();
h = getHeight();
if(i == 0){
GOUKEI = newArray(w*h);
//Array.print(GOUKEI);
}
print("ImgNo.",i+1);
TEMP = convert1D();
for(k=0; k<w*h; k++){
GOUKEI[k] = GOUKEI[k] + TEMP[k];
}
close();
}
//Average
for(n=0; n<w*h; n++){
GOUKEI[n] = GOUKEI[n] / list.length;
}
//Create Average Image
width = w;
height = h;
newImage("NewImage", "32-bit black", width, height, 1);
selectWindow("NewImage");
for(y=0; y<height; y++){
for(x=0; x<width; x++){
address = x + y * width;
newValue = GOUKEI[address];
setPixel(x,y,newValue);
}
}
//Name setting
slashIndex = indexOf(listOp[m],"/");
title = substring(listOp[m],0,slashIndex);
newname = title + ".tif";
rename(newname);
//Save As TIFF
saveAs("TIFF", saveDir + newname);
print("Save to...",saveDir + newname);
close(newname);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Define function convert1D
//2 Dimension image to 1 Dimension array
function convert1D(){
w = getWidth();
h = getHeight();
array1D = newArray(w*h);
for(y=0; y<h; y++){
for(x=0; x<w; x++){
pixelValue = getPixel(x,y);
array1D[x+y*w] = pixelValue;
}
}
return array1D;
}
//-----------------------------------------------------------------------------
ImageJは2次元配列を扱うことが出来ないので、一度1次元配列に直してから処理しています。(画像を短冊状に切って、長〜いテープのように繋げていくイメージ)
保存画像はTIFF形式なので、余計な処理が入らずそのまま解析に使えると思います。
以上です。ご希望に沿うことは出来たでしょうか?
不明点ありましたら、お気軽にコメントください!