画像の類似度

scikit-imageを使い、2つの画像の類似度を測ってみます。OpenCVなども使うことができると思います。

画面がソフトラップしてくれないので見にくいですね。対策を考えなくては

from skimage.metrics import structural_similarity as ssim
from skimage import io, transform
import os
import numpy as np # Import numpy

# 画像を読み込む
# Get the current working directory
current_directory = os.getcwd()

# Load the images using the full path
image1 = io.imread("/content/image1.png")
image2 = io.imread("/content/image2.png")

# Resize image2 to match the dimensions of image1
image2 = transform.resize(image2, image1.shape, anti_aliasing=True)

# SSIMを計算
# Dynamically adjust win_size based on image dimensions, ensuring it's odd
win_size = min(7, min(image1.shape[0], image1.shape[1]) - 1)
win_size = win_size if win_size % 2 != 0 else win_size - 1

# Further reduce win_size if still too large
# This loop iteratively reduces win_size until it fits within the image dimensions.
while win_size > 1 and np.any((np.asarray(image1.shape) - win_size) < 0):
    win_size -= 2

# Calculate SSIM with the adjusted win_size and actual data range
ssim_score = ssim(image1, image2, multichannel=True, win_size=win_size, data_range=image1.max() - image1.min())

# 0から100の指標に変換
similarity_score = (ssim_score + 1) * 50

print(f"類似度: {similarity_score:.2f}")

構造的類似性指標 (SSIM):

  • 画像の輝度、コントラスト、構造を考慮して類似度を評価します。
  • 人間の視覚 perception に近い評価ができます。

上のサンプルコードは、Google の Colab で簡単に試すことが可能です。画像の準備が必要です。

https://colab.research.google.com