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

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

「自動サイズ認識失敗」を検出する目的で、縦横のpixel数を調べるためのMacro

f:id:yu3xx:20200624020344j:plain

 

読み取り範囲の認識に失敗して、無駄な余白が出来てしまった画像を検出するために、選択したフォルダ内の全画像の「縦横の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)から外れるものを異常としている。)

④ サイズ認識失敗の画像があれば、「トリミング」や「再スキャン」で対応。

 

 

実際に使用してみると 

f:id:yu3xx:20200316014139j:plain

縦横pixel数の結果。グラフ横軸は「画像の順番・番号」

 

f:id:yu3xx:20200316014248p:plain

結果(Log)。No.1, No.2はカラー表紙なので、No.65がサイズ認識失敗の可能性あり!

 

マクロの起動方法

①ImageJ上部タブの[Plugins]→[New]→[Macro]で起動したエディタに、記事の一番上のコードをコピペしてtxtファイル(ScanQC_Width_Height.txt)を作成・保存する。 

 

②保存したファイルをImageJフォルダ内の[plugins]フォルダにしまう。

このとき、[plugins]フォルダの中に新たに適当な名前のフォルダを作って、その中にしまってもOKです。ここでは仮に「自炊」というフォルダにtxtファイルを突っ込んだとします。

 

③一度ImageJを再起動すると、マクロがインストールされ、起動準備OK。

 

④上部タブ[Plugins]→[自炊]→[ScanQC Width Height]でマクロが実行されます。

 

 

 

imagej-jisui.hatenablog.com

 

 

 

 

ライセンスなんかは一切無いので、ぜひぜひ自由に使ってみてください!

 

 

imagej-jisui.hatenablog.com