SSIM実習 (フォルダ内一括計算)

本日のお題:フォルダ内の画像を一括計算する

すでに、SSIMの計算ツール(C++版)を、ソース付きで公開しておきましたので、本日は、その応用です。1個1個ちまちまとSSIM計算をしないで、フォルダ単位で、一気にドビャーっと計算してみましょう。


まず準備です。どこでも良いので、SSIM計算の拠点を作りましょう。以下は、Cドライブ直下にSSIMフォルダを作成し、そこを拠点とする例です。


次にサンプルのオリジナル画像を用意してください。これまでに何度が登場していただいてます「ミスターSSIM」こと、Wangさんの論文をサンプル画像としましょう。


Image Quality Assessment: From Error Visibility to Structural Similarity
http://www.cns.nyu.edu/pub/eero/wang03-reprint.pdf


ここ(TIFF.zip 直)にTIFF画像を用意しましたので、ダウンロードして、展開して、先ほどのSSIMフォルダ内に入れてみてください。


次にSSIMの測定をしたい画像を用意するのですが、今回は、SSIMがだいたい0.87になるような画像を作っておきました。こちら(TIFF87.zip 直)からダウンロードして、展開して、先ほどのSSIMフォルダ内に入れてみてください。(本当に0.87なのか、確かめてみましょう。)


次に、空のフォルダを作成し、MAPと名づけておきましょう。前回も「心霊写真」としてご紹介した画像を入れていくためのものです。


さて、あとは、このTIFFフォルダ内のTIFF画像と、TIFF87内のTIFF画像を、順番にSSIM計算にかけ、SSIMマップをMAPフォルダへ作成しつつ、計算結果を表示する、というプログラムを組めばよいですね。とりあえず、こんなんでどうでしょうか?(%ばっかしでみにくいですね)

@echo off
echo --------------------------------------------------------
echo SSIM検査しますよー Ver2.0
echo --------------------------------------------------------

PAUSE


REM  --------------------------------------------------------

REM 元の画像が入ったフォルダさん (TIFF画像)
set ORIGINAL=TIFF

REM 比較する画像が入ったフォルダさん (TIFF画像)
set DISTORTED=TIFF87

REM MAP画像を入れるフォルダさん (PNG画像)
set SSIMMAP=MAP

REM  --------------------------------------------------------


echo ----- SSIM検査開始だよ -----

FOR %%B IN (%ORIGINAL%/*.tif) DO (
	for /f "tokens=1 delims=." %%i in ("%%B") do (
		echo %%i: >> result.txt
		SSIM.exe %ORIGINAL%/%%B %DISTORTED%/%%i.tif %SSIMMAP%/%%i.png >> result.txt
		echo %%i: done...
	)
)

echo ----- SSIM検査完了だよ -----

PAUSE

このプログラムをテキストファイルにコピペして、「SSIMtool.bat」などと名づけて、先ほどのSSIMフォルダに入れてください。


これで準備完了のような気がします。


「SSIMtool.bat」をダブルクリックすると、

という感じでストップするので、電源ボタン以外なら何でも良いので押してください。

という感じで、計算がされていき、しばらくすると、

こんな感じで、作業終了を告げ、再びストップしますので、何か押して、ウィンドウを閉じちゃってください。


先ほどのSSIM計算の拠点(SSIMフォルダ)の中に、result.txtというファイルができました。

その中身を見ると、

0001:
SSIMは0.869934でした。
0002:
SSIMは0.869602でした。
0003:
SSIMは0.869551でした。
0004:
SSIMは0.869784でした。
0005:
SSIMは0.870353でした。
0006:
SSIMは0.870439でした。
0007:
SSIMは0.869701でした。
0008:
SSIMは0.869958でした。
0009:
SSIMは0.870334でした。
0010:
SSIMは0.869611でした。
0011:
SSIMは0.870429でした。
0012:
SSIMは0.86957でした。
0013:
SSIMは0.870167でした。

という結果だったらしいので、0.87±0.0005くらいの精度だ、ということが確認できましたね。


ちなみに、MAPフォルダ内をみると、

こんな感じの画像が入っていて、これは、TIFFフォルダの画像とTIFF87フォルダの画像を比較して、SSIM的に重要な違いがある部分を黒くした、という「SSIMマップ*1」です。(今回のMAPはMAP.zip 直を見てください。)


というわけで、とりあえず、フォルダを指定してやれば、その中の画像をひたすら計算していくプログラムができたわけです。*2


次回は、ズバリ、JP2ファイルの特定レイヤーのSSIM測定にトライしてみるかもしれません。

*1:詳しくは、http://d.hatena.ne.jp/denshikA/20100701を参照。

*2:ただし、この方法だと、大きなサイズのファイルや、すごーく大量のファイルを処理する場合、ヘンテコなことになる可能性がありますので、あしからず。