OpenCVを使ってSSIMに基づいた画像の類似度をチェックする方法

2つの画像を比較している絵 OpenCV

画像を扱う際に、2枚の画像がどれだけ似ているのかを評価したいケースを考えます。

例えば以下の2枚の画像です。

比較対象画像1

比較対象画像2

類似度を測る

まずは2枚の画像を読み込みます。

import cv2

img1 = cv2.imread("image1.png") / 255
img2 = cv2.imread("image2.png") / 255

ここで、画像を255で割っていることに注意してください。

次に、画像の差分を計算するためにOpenCVの QualitySSIM_computeを実行します。

これはSSIM(Structural similarity)という基準に基づいて類似度を計算してくれるものであり、これの大きさを見ることで画像が似ているか否かを判断することができます。

SSIMはMSEという指標とは異なり、より人間の主観評価に近い値を算出してくれることで知られており、0~1の値で示されます。

mssim, ssim = cv2.quality.QualitySSIM_compute(img1, img2)

実行結果としてRGBそれぞれの平均SSIMの値と小領域毎のSSIMの値が返ってきます。

例えば、R(赤)のSSIMを確認するには以下のように実行します。

print(mssim[0])
// 実行結果例
// 0.9999884091297208

この値が1に近ければ近いほど、R成分の類似している度合いが高かったことを示します。

また、類似度を可視化したい場合は以下のようにRGBのSSIMの平均を計算し、それをmatplotlibなどで表示してあげることで実現できます。

from matplotlib import pyplot as plt

# RGBの方向で平均を計算する
ssim_image = 1 - ssim.mean(axis=2)

# カラーマップjetでSSIMを可視化する
plt.figure()
plt.imshow(ssim_image, cmap="jet")
plt.show()

この時、SSIMは最大1の類似度を示すので、可視化するときは1からSSIMを引いていることに注意してください。

これ実行すると以下のように差分が可視化された画像が出力されます。赤の部分が類似度が低かった部分、青の部分が類似度が高かった部分に対応します。

まとめ

本記事ではOpenCVの QualitySSIM_computeを用いて、画像の差分を計算・可視化する方法をまとめました。

1行書くだけで画像の類似度が簡単に計算ができるので、非常に強力なツールです。

また、MSEと異なり人間の主観評価と近しい値が得られるので、画像の劣化度合いの評価などに利用するのに便利です。

画像類似度チェッカー

本ブログでは画像の類似度をブラウザだけで測ることができるツールを公開しています。

SSIMなどによる類似度の計算結果が簡単に取得できるので、気軽に使ってみてください!

どれだけ画像が似ているかの評価に便利!

コメント

タイトルとURLをコピーしました