2015年11月15日日曜日

2つの画像を比較してみる※mayaをインストールした人用

とある目的で、2つの画像を比較し、違いがどれくらいなのかを数値で表せられないかとネットで調べていたところ、ImageMagickで数値化できそうなことを発見。

しかしツールを新規にインストールするのは美学に反するので、今ある環境でどうにかします。


mayaをインストールするとmayaのbinフォルダ内に幾つかの.exeファイルを見つけることができます。
その中でimconvert.exeというのが、実はImageMagickであるというのは数年前から知っていたので、これを使います。

ただ、本家よりもかなり機能や使い方が変更されているのでなかなか難航。
imconvert.exe -hと本家のリファレンスを見比べつつ、必要なオプションを割り出していきます。


本家のほうには、
compare -metric PSNR

とすることで数値化できるっぽいのですがimconvertの方には見つからず・・・。
似たことができないかとimconvertのヘルプを読んでいると、-identify -verboseを使えば出来そうな予感。

実際、ログを見てみると欲しい情報のmean: ~を発見。
ただ、これだと2つの画像の比較が出来ず、ファイル情報を垂れ流すだけ。
もうひと手間必要。

ファイルの情報が取れるということは、差分の画像ファイルを作ることができれば、そのファイルの-identify -verbosを取ればよいということなので、今度は差分ファイルの作成方法を調べることに。


もともと、ImageMagickはファイル形式の変換や編集、合成をコマンドラインで行うツールのようなので、差分ファイルの作成方法は割と簡単に判明。
-composite -compose difference で作れるらしい。

@echo off

set WORK_AREA=%~dp0
set MAYA_BIN=C:\Program Files\Autodesk\MayaLT2016\bin\

:: 比較する画像
set IMG_A=%WORK_AREA%A.bmp
set IMG_B=%WORK_AREA%B.bmp

:: 結果画像
set OUT_IMG=%WORK_AREA%C.bmp


:: imconvert実行
"%MAYA_BIN%imconvert.exe" -composite -compose difference "%IMG_A%" "%IMG_B%" "%OUT_IMG%"

pause



 
A.bmp      B.bmp    C.bmp

この差分ファイルのC.bmpに対して-identify -verbose を使用する。
なんとなく欲しいデータが取れそう。

これを元にバッチファイルを作成。

@echo off
title %~n0

set WORK_AREA=%~dp0
set MAYA_BIN=C:\Program Files\Autodesk\MayaLT2016\bin\


:: 比較する画像
set IMG_A=%1
set IMG_B=%2
:: 存在確認
if ""=="%IMG_A%" echo IMG_A is blank. & pause & exit /b
if ""=="%IMG_B%" echo IMG_B is blank. & pause & exit /b
if not exist "%IMG_A%" echo %IMG_A% not found. & pause & exit /b
if not exist "%IMG_B%" echo %IMG_B% not found. & pause & exit /b


:: imconvertの作業エリア作成
set IMCNV_TMP=%WORK_AREA%_tmp
if not exist "%IMCNV_TMP%" md "%IMCNV_TMP%"

:: 差分画像のファイル名
set OUT_IMG=%IMCNV_TMP%\out.png
:: ログファイル名
set VRBS_FILE=%IMCNV_TMP%\verbose
set MEAN_FILE=%IMCNV_TMP%\mean


:: imconvert実行
"%MAYA_BIN%imconvert.exe" -composite -compose difference "%IMG_A%" "%IMG_B%" "%OUT_IMG%"
"%MAYA_BIN%imconvert.exe" -identify -verbose "%OUT_IMG%" "%OUT_IMG%">%VRBS_FILE%


:: 結果解析
find "mean:" %VRBS_FILE% | find "mean:">%MEAN_FILE%
set RESULT_MEAN=
for /F "tokens=1-3" %%A in (%MEAN_FILE%) do set RESULT_MEAN=%%B


:: 結果表示
echo %RESULT_MEAN%
pause


画像ファイルを2つ、このバッチファイルへドラッグ&ドロップすると違いの数値が出てくる。


0 件のコメント:

コメントを投稿