我想使用 SIFT 计算两个图像之间的相似性。我已经设法计算匹配并将其可视化,如下图所示。 我有一张埃菲尔铁塔的图片和另一张经过大量修改的埃菲尔铁塔的图片。对我来说,这个匹配看起来不错,但我不知道使用什么指标、方程或算法来计算相似度或评估匹配。
我正在使用以下代码来计算匹配。
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都给出了不好的结果。
评估者必须考虑:缩放、旋转和平移
有任何想法吗?