比较图片时,OPenCV中的SIFT和ORB方法在一张图片被镜像时不起作用

问题描述

我正在尝试在文件夹中查找“几乎”相同的所有图片。 “几乎相同”是指例如您有一张原始图片,并且您对该图片进行了修改修改可以是改变分辨率,图片变成灰度,图片被裁剪,图片旋转,添加一个框架或一些文字图片被镜像......

我正在使用带有 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 检测器的一个属性 - 两者都不是反射不变的。

如果您对匹配反射图像感兴趣,则需要执行以下操作之一:

  1. 使用对称关键点检测器,例如FAST、Harris 或 CeNSURE,然后在反射的关键点上使用 SIFT 描述符。
  2. 实现反射不变描述符,如 MBR-SIFT

对本文给出的问题进行了很好的分析:Symmetric Stability of Low Level Feature Detectors

祝你好运!