2

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_scoresift_accはどちらも悪い結果をもたらします。

評価者は以下を考慮に入れる必要があります: スケーリング、回転、移動

何か案は?

4

0 に答える 0