読み取り範囲の認識に失敗して、無駄な余白が出来てしまった画像を検出するために、選択したフォルダ内の全画像の「縦横のpixel数」を調べるマクロです。
//scanQC_WidthHeight.txt
//hide images ON
setBatchMode(true);
//Do something for selected Dir
showMessage("Select Open Folder");
openDir=getDirectory("Choose a Directory");
list=getFileList(openDir);
//limit setting
limit=100;//pixel
//operation
print("");
print("Check for",openDir);
W=newArray(list.length);
H=newArray(list.length);
sumW=0;
sumH=0;
for (i=0; i<list.length;i++){
open(openDir+list[i]);
//progress
print(i+1,"/",list.length,"...Progress=",floor((i+1)/list.length*10000)/100,"%");
width=getWidth();
height=getHeight();
W[i]=width;
H[i]=height;
close();
}
//hide images OFF
setBatchMode(false);
//buckUp originalData
orgW=newArray(list.length);
orgH=newArray(list.length);
for(i=0;i<list.length;i++){
orgW[i]=W[i];
orgH[i]=H[i];
}
//caliculate median
W=bubbleSort(W);
H=bubbleSort(H);
medianW=W[floor(list.length/2)];
medianH=H[floor(list.length/2)];
print("");
print("....Median (width, height) =","(",medianW,",",medianH,")");
//suspicios(outside of median+-limit[pixel])
countW=0;
countH=0;
print("------------------------suspicios-----------------------------");
for (i=0; i<list.length;i++){
if(orgW[i]>medianW+limit||orgW[i]<medianW-limit){
print("No.",i+1,",",list[i]," ( w =",orgW[i],")");
countW++;
}
if(orgH[i]>medianH+limit||orgH[i]<medianH-limit){
print("No.",i+1,",",list[i]," ( h =",orgH[i],")");
countH++;
}
}
if(countW==0 && countH==0)print("None");
print("-----------------------------------------------------------------");
//Plot Graphs
i=linspace(1,list.length,list.length);
Plot.create("width","No.","pixel",i,orgW);
Plot.show();
Plot.create("height","No.","pixel",i,orgH);
Plot.show();
print("oshimai");
//-----------------------------------------------------------------------------
//Define function linspace (generate Arithmetric Sequence)
//a->1st term, an->last term, n->term number
function linspace(a,an,n){
A = newArray(n);
d = (an-a)/(n-1);
for(i=0;i<n;i++){
A[i]=a+i*d;
}
return A;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Define function bubble_sort
function bubbleSort(A){
n=A.length;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(A[j]<A[j-1]){
tmp=A[j];
A[j]=A[j-1];
A[j-1]=tmp;
}
}
}
return A;
}
//-----------------------------------------------------------------------------
使い方
① マクロ「ScanQC_WidthHeight.txt」を起動させる。
② 調べたい画像の入ったフォルダを指定する。
③ 出力される「グラフ」と「Log」によりpixel数が異常とされる画像が判別出来るので、実際に画像を見て調べる。
(初期設定では、中央値(Median)±限界値(Limit = 100 pixel)から外れるものを異常としている。)
④ サイズ認識失敗の画像があれば、「トリミング」や「再スキャン」で対応。
実際に使用してみると
マクロの起動方法
①ImageJ上部タブの[Plugins]→[New]→[Macro]で起動したエディタに、記事の一番上のコードをコピペしてtxtファイル(ScanQC_Width_Height.txt)を作成・保存する。
②保存したファイルをImageJフォルダ内の[plugins]フォルダにしまう。
このとき、[plugins]フォルダの中に新たに適当な名前のフォルダを作って、その中にしまってもOKです。ここでは仮に「自炊」というフォルダにtxtファイルを突っ込んだとします。
③一度ImageJを再起動すると、マクロがインストールされ、起動準備OK。
④上部タブ[Plugins]→[自炊]→[ScanQC Width Height]でマクロが実行されます。
ライセンスなんかは一切無いので、ぜひぜひ自由に使ってみてください!