その漫画自炊オタクはImageJマクロに恋をする

プログラミングを用いた、自炊漫画の画像処理

【ご質問回答】複数の子フォルダに格納された画像を平均化するためのマクロ

 

こんにちは。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形式なので、余計な処理が入らずそのまま解析に使えると思います。

 

 

 以上です。ご希望に沿うことは出来たでしょうか?

不明点ありましたら、お気軽にコメントください!