SSIMを算出できるツールについて調べたのでまとめました。6種類のツールと、おまけでふたつ紹介します。
単体で利用できるプログラム
お馴染みのプログラムでSSIMの計算ができます。
ImageMagick
ImageMagickに同梱のcompare
コマンドで計算できます。
$ compare -metric SSIM sample/a.jpg sample/b.jpg NULL:
# 出力
0.909166
compare
コマンドは通常、差分を視覚化した画像を出力しますが、出力画像(第三引数)にNULL:
を渡すことで数値を取得できるようです。
SSIM値はなぜか標準出力ではなく、標準エラーに出力されます。
PSNRなど他の指標も計算することができ、次のコマンドでその一覧を確認することができます。
$ compare -list Metric
手元のImageMagick 7.0.8-4では、AE, DSSIM, Fuzz, MAE, MEPP, MSE, NCC, PAE, PHASH, PSNR, RMSE, SSIMが表示されました。
ffmpeg
動画編集のツールキットとして有名なffmpegでもSSIMの計算ができます。本来は動画のSSIMを計算する機能ですが、静止画にも対応しています。
$ ffmpeg -i sample/a.jpg -i sample/b.jpg -filter_complex ssim -an -f null -
# 出力(中略)
[Parsed_ssim_0 @ 0x7f8d5ad01200] SSIM Y:0.932679 (11.718525) U:0.974958 (16.013383) V:0.975355 (16.082717) All:0.960998 (14.089098)
かなり多くの情報が出力されますが、最後の行で0.960998
という結果が得られました。
Jpeg Archive
Jpeg Archiveは、日本での知名度はあまり高くありませんが、とても強力なJpegファイルの軽量化のためのツールキットです。
同梱されているjpeg-compare
コマンドでJpeg同士のSSIM値を求めることができます。
$ jpeg-compare -m ssim sample/a.jpg sample/b.jpg
# 出力
SSIM: 0.998998
こちらも-m
オプションの値によりPSNRなどの計算も可能です。
参考 dssim
PNGの軽量化ツールでお馴染みの pngguant と同じサイトで公開されているプログラムです。
PNG専用で、SSIMをベースにした独自の指標のようです。結果の数値もSSIMと異なり、数値も差分が少ないほど0に近い数字となるようです。
dssim
https://pngquant.org/dssim.html
$ dssim sample/a.png sample/b.png
# 出力
0.004913 sample/b.png
おまけ butteragli
Googleから登場して話題になったJpeg軽量化ツールの Guetzli が評価指標に用いているのが butteraugli ですが、同じように単体で使うこともできます。
$ butteraugli sample/a.jpg sample/b.jpg
# 出力
3.929208
特定スクリプト言語向けモジュール
Python
jterrace/pyssim
https://github.com/jterrace/pyssim
コマンドラインツールとしても利用できます。
# インストール
$ pip install pyssim
# コマンドとして実行
$ pyssim sample/a.jpg sample/b.jpg
# 出力
0.9198549
JavaScript
NPMにはいくつかSSIM算出用のモジュールが登録されています。
img-ssim
https://www.npmjs.com/package/img-ssim
graphicmagick が必要でした。
# インストール
$ npm i -g img-ssim
# ワンライナーでとりあえずSSIMを出力
$ node -e 'require("img-ssim")("sample/a.jpg", "sample/b.jpg", (e,s) => console.log(e || s))'
# 出力
0.9339968421131201
Webツール
Image SSIM
http://darosh.github.io/image-ssim-js/test/browser_test.html
お手軽にブラウザ上でSSIMを算出できるツールです。次のJavaScript用モジュールのデモとして公開されています。
darosh/image-ssim-js
https://github.com/darosh/image-ssim-js
ベンチマーク
圧縮率を変えて保存したある2枚のJpeg画像について、それぞれのツールのSSIM値と所要時間を計測しました。
プログラム | SSIM値 | 所要時間 |
---|---|---|
ImageMagick | 0.909166 | 5.148s |
ffmpeg | 0.960998 | 0.134s |
Jpeg Archive | 0.998998 | 0.109s |
pyssim | 0.9198549 | 1.903s |
img-ssim | 0.9339968421131201 | 4.058s |
butteraugli | ※所要時間の比較まで | 4.417s |
算出されるSSIM値も所要時間も、かなりバラツキがありました。
SSIMは小領域の分割サイズや数式上のパラメータを利用者が決めるようなので、おそらくその値の違いによる影響なのかと推測しています。