问题描述
我正在尝试在文件夹中查找“几乎”相同的所有图片。 “几乎相同”是指例如您有一张原始图片,并且您对该图片进行了修改。 修改可以是改变分辨率,图片变成灰度,图片被裁剪,图片旋转,添加一个框架或一些文字,图片被镜像......
我正在使用带有 SIFT 和 ORB 的 OpenCV(我选择了我想要使用的方法,我不会同时使用它们)。 对于所有图片变化,SIFT 和 ORB 都工作得很好。但不适用于镜像。 即使我只对第一张图片做了镜像(意思是我不改变任何其他东西),得分也有10%左右。
我不明白,因为我认为 SIFT 和 ORB 正在计算关键点的距离。但是当拍摄镜像时,距离不会改变。只有方向。
我错过了什么?
这是我的代码摘录:
if method == 'ORB':
finder = cv2.ORB_create()
elif method == 'SIFT':
finder = cv2.xfeatures2d.SIFT_create()
lowe_ration = 0.86
# find the keypoints and descriptors with SIFT or ORB
for i in range(0,count-1):
for j in range(i+1,count):
kp1,des1 = finder.detectAndCompute(all_new_images_to_compare[i],None)
kp2,des2 = finder.detectAndCompute(all_new_images_to_compare[j],None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)
good_points = []
for m,n in matches:
if m.distance < lowe_ratio * n.distance:
good_points.append(m)
number_keypoints = 0
if len(kp1) >= len(kp2):
number_keypoints = len(kp1)
else:
number_keypoints = len(kp2)
percentage_similarity = len(good_points) / (number_keypoints) * 100
if (percentage_similarity)>=10:
myfile1=open("C:/Users/ABC/Documents/Find-Similar-Pictures/results_" + method + ".txt","a")
myfile1.write(str(titles[i]) + "\t" + str(titles[j]) + "\t" + method + " (" + str(lowe_ratio) + ") \t" + str(int(percentage_similarity) ) + "\t\n")
myfile1.close()
print(titles[i],titles[j],"== Similarity: " + str(int(percentage_similarity)),method + " (" + str(lowe_ratio) + ")")
print("___done with file",titles[i])
print("=====done=====")
非常感谢您的帮助
解决方法
您发现了 ORB 描述符和 SIFT 检测器的一个属性 - 两者都不是反射不变的。
如果您对匹配反射图像感兴趣,则需要执行以下操作之一:
- 使用对称关键点检测器,例如FAST、Harris 或 CeNSURE,然后在反射的关键点上使用 SIFT 描述符。
- 实现反射不变描述符,如 MBR-SIFT。
对本文给出的问题进行了很好的分析:Symmetric Stability of Low Level Feature Detectors
祝你好运!