image magick で画像の比較をすることが出来る。
画像の比較をするにはいろいろな方法がある。
- 目で見てわかりやすい→WEBや校正用
- 機械的に見てわかりやすい→ダイアログなどプログラムのテスト
- 画像におおきな影が出る→動体検出
等と大きく分けて使い分けることになると思います。とくに機械学習などで自動化の事前処理に役立つと思います。
元画像1: 1.png
元画像2 : 2.png
機械的に色を見るやり方
比較方法
compare の場合
compare -metric AE 1.png 2.png compare-AE.png
metric による違い
AEとPSNR の違いを見ておきます。キャプチャ画面はAEの方が良さそう。
AE の例
PSNR の例
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 の例
差分量による差異の計算
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 : 元画像の赤色化
2_blu.png: 元画像の青色化
diff.png
- 赤色:元画像1の部分にしか無い箇所
- 青色:元画像2の部分にしかない箇所
と元画像の差分を視覚的に伝えることが出来ます。
さて何に使う?
- 画像(動画)を圧縮したときの劣化率具合をみたり
- 連写の違いをみたり
- 動体検出の事前処理だったり
- WEBページのレイアウト崩れだったり
- WEBの広告枠がきちんと更新されるか
- 巨大なExcelの細かい数字の違いを探したり
- ダイアログが修正前後で同じか比較したり
- イラレ原稿の変更箇所を伝える
画像を比較したら、結構あれこれできそうですよね。
スクリーンショットや、動画からの切り出しは便利ですよね。OpenCVでアコレいじくりまわすときでも複雑なことやら無くて済むので。役に立ちそう
追記
ImageMagick で画像を比較する - awm-Tech によると、SSIMを ffmpegで使うと簡単に劣化具合がわかるらしい
ffmpeg -i image1.jpg -i image2.gif -filter_complex ssim -an -f null -
magick にも限界があるのでffmpeg の利用も考えていきたい。