1. Pythonコード
import cv2
import numpy as np
from skimage.metrics import structural_similarity as compare_ssim
# 画像を読み込む
image1 = cv2.imread('image1.png')
image2 = cv2.imread('image2.png')
# 画像サイズの取得
(h1, w1) = image1.shape[:2]
(h2, w2) = image2.shape[:2]
# 画像サイズが異なる場合、2つ目の画像を1つ目の画像のサイズにリサイズ
if (h1, w1) != (h2, w2):
image2 = cv2.resize(image2, (w1, h1))
# グレースケールに変換
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# SSIM(構造類似性指数)を計算して、差分を取得
(score, diff) = compare_ssim(gray1, gray2, full=True)
diff = (diff * 255).astype("uint8")
print(f"SSIM: {score}")
# 差分画像を二値化
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
# 輪郭を検出
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# オリジナル画像に差異をハイライト表示
for contour in contours:
if cv2.contourArea(contour) > 100: # 小さな違いは無視
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.rectangle(image2, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 結果を表示
cv2.imshow("Image 1", image1)
cv2.imshow("Image 2", image2)
cv2.imshow("Diff", diff)
cv2.imshow("Thresh", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. プログラムの動作説明
- 画像サイズの確認:
image1とimage2のサイズを取得し、サイズが異なる場合は、cv2.resizeを使用してimage2をimage1のサイズにリサイズします。
- グレースケール変換と比較:
- サイズが同じであることを確認した後、両方の画像をグレースケールに変換し、構造類似性指数(SSIM)を計算して差分を取得します。
- 差分の二値化と輪郭検出:
- 差分画像を二値化し、
cv2.findContoursを使用して輪郭を検出します。
- 違いをハイライト:
- 差分が見つかった部分に赤い四角を描き、違いを視覚的に強調します。
- 結果の表示:
- 元の画像と差分画像を表示し、どこに違いがあるかを確認できます。
3. 実行時の注意点
- 画像ファイルのパスは、実際に使用するファイル名に置き換えてください(例:
image1.pngとimage2.png)。 - 画像サイズが非常に異なる場合、リサイズ後の比較結果が正確でない可能性があるため、事前に適切なサイズで画像を準備することをお勧めします。
このプログラムは、画像サイズを自動で調整しながら、間違い探しを行う機能を備えています。これにより、異なるサイズの画像でも簡単に比較することが可能になります。