SIFT を使用して 2 つの画像の類似性を計算したいと考えています。下の画像に示すように、一致を計算して視覚化することができました。
エッフェル塔の画像と、大幅に変更されたエッフェル塔の画像があります。私にはこの一致は良さそうに見えますが、類似度を計算したり、一致を評価したりするために使用するメトリック、方程式、またはアルゴリズムがわかりません。
次のコードを使用してマッチングを計算しています。
import cv2
# Read images
img1 = cv2.imread("eiffel_normal.jpeg")
img2 = cv2.imread("eiffel_rotated.jpeg")
#sift
sift = cv2.SIFT_create()
# Get keypoints and descriptors
keypoints_1, descriptors_1 = sift.detectAndCompute(img1, None)
keypoints_2, descriptors_2 = sift.detectAndCompute(img2, None)
#feature matching
bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True)
matches = bf.match(descriptors_1,descriptors_2)
matches = sorted(matches, key=lambda x:x.distance)
# Visualize the results
img3 = cv2.drawMatches(img1, keypoints_1, img2, keypoints_2, matches[:30], img2, flags=2)
plt.imshow(img3)
plt.show()
私はもう試した:
def calculateScore(matches, key_1_len, key_2_len):
return 100 * (matches/min(key_1_len, key_2_len))
similar_regions = [i for i in matches if i.distance < 50]
sift_score= calculateScore(len(matches), len(keypoints_1), len(keypoints_2))
sift_acc = len(similar_regions)/len(matches)
しかし、sift_scoreとsift_accはどちらも悪い結果をもたらします。
評価者は以下を考慮に入れる必要があります: スケーリング、回転、移動
何か案は?