それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

画像の比較をしてズレがないか調べる

image magick で画像の比較をすることが出来る。

画像の比較をするにはいろいろな方法がある。

  • 目で見てわかりやすい→WEBや校正用
  • 機械的に見てわかりやすい→ダイアログなどプログラムのテスト
  • 画像におおきな影が出る→動体検出

等と大きく分けて使い分けることになると思います。とくに機械学習などで自動化の事前処理に役立つと思います。

元画像1: 1.png

f:id:takuya_1st:20170224170950p:plain:w300

元画像2 : 2.png

f:id:takuya_1st:20170224170905p:plain:w300

機械的に色を見るやり方

比較方法

compare の場合

compare -metric AE 1.png 2.png compare-AE.png

metric による違い

AEとPSNR の違いを見ておきます。キャプチャ画面はAEの方が良さそう。

AE の例

f:id:takuya_1st:20170224171416p:plain:w300

PSNR の例

f:id:takuya_1st:20170224171433p:plain:w300

metric 一覧を見るには

takuya@Desktop$ compare -list metric
AE
Fuzz
MAE
MEPP
MSE
NCC
PAE
PHASH
PSNR
RMSE

composite で画像の差分を見る

compsite コマンドで画像を合成して、差分を明確することも出来る。同じ色だと黒色になる。スクリーンキャプチャに向いてる。

composite -compose difference 1.png 2.png compsite-diff.png

composite diffrence の例

f:id:takuya_1st:20170224171539p:plain:w300

差分量による差異の計算

composie をしたときに、同じ部分は「黒色」に近づくので、より黒色に近いほどに差分がないことがわかる

identify -format "%[mean]" compsite-diff.png
## または 改行とファイル名を含めるなど
identify -format "%[mean], %f\n" compose-difference.png
  • 差分がない:0 に近くなる
  • 差分がある:0からどんどん離れる( 0(黒)〜65535(白)

目で見てわかりやすいやり方。

差を色でわかりやすくする

差分を計算するのとは異なりますが、画像を合成することで、見た目でわかりやすくするテクニックも見つけた。

事前処理で、差分を見る画像に色を付けておくと、少しわかりやすくなる

  • 元画像1:青系
  • 元画像2:赤系

事前処理

convert -type GrayScale +level-colors Red,White 1 .png 1_red.png
convert -type GrayScale +level-colors Blue,White 2.png 1_blu.png

合成処理

convert -compose Multiply -composite 1_red.png 1_blue.png a_b_diff.png

色の見方は次のとおりになる。黒系になれば両方に差分が有り、赤・青なら片方だけに差分がある。

白 × 白 = 白 
白 × 青 = 青
白 × 赤 = 赤
赤 × 青 = 黒

此の考え方だと、片方にしか無いものがより際立ってわかりやすくする事ができる。 事前処理で色数減らすのは頭いいなぁと思う。

サンプル

元画像を2色画像に加工します。

1_red.png : 元画像の赤色化

f:id:takuya_1st:20170224173255p:plain:w300

2_blu.png: 元画像の青色化

f:id:takuya_1st:20170224173300p:plain:w300

diff.png

  • 赤色:元画像1の部分にしか無い箇所
  • 青色:元画像2の部分にしかない箇所

と元画像の差分を視覚的に伝えることが出来ます。

f:id:takuya_1st:20170224173307p:plain:w300

さて何に使う?

  • 画像(動画)を圧縮したときの劣化率具合をみたり
  • 連写の違いをみたり
  • 動体検出の事前処理だったり
  • WEBページのレイアウト崩れだったり
  • WEBの広告枠がきちんと更新されるか
  • 巨大なExcelの細かい数字の違いを探したり
  • ダイアログが修正前後で同じか比較したり
  • イラレ原稿の変更箇所を伝える

画像を比較したら、結構あれこれできそうですよね。

スクリーンショットや、動画からの切り出しは便利ですよね。OpenCVでアコレいじくりまわすときでも複雑なことやら無くて済むので。役に立ちそう

追記

ImageMagick で画像を比較する - awm-Tech によると、SSIMを ffmpegで使うと簡単に劣化具合がわかるらしい

ffmpeg -i image1.jpg -i image2.gif -filter_complex ssim -an -f null -

magick にも限界があるのでffmpeg の利用も考えていきたい。

参考資料