根据提取的 SIFT 描述符通过欧几里德距离(或任何其他距离计算技术)估计两幅图像的相似度分数

Gre*_*ner 2 python opencv image-processing computer-vision sift

我已经使用 openCV python 使用 python 2.7 计算了图像 A 和 B 的 SIFT 描述符。图像 A 有 16X128 (=2048) 个描述符,图像 B 有 10X128 (=1280) 个描述符。现在我陷入困境,因为我不知道如何生成相似度分数。如果您能帮助我,我将不胜感激。

分数或相似性项是一对匹配描述符之间的测量(例如欧几里得距离),但是将图像中的 SIFT 描述符本身与另一个图像中的 SIFT 描述符本身进行比较是不可行的,因为最终会在图像中得到多个 SIFT 描述符,以及它们的数量正如我之前提到的,图像 A 有 16X128 (=2048) 个描述符,另一个有 1028 个。

在matlab VL-feat中,SCORE的实现如下:

[fa, da] = vl_sift(Image_a) ;
[fb, db] = vl_sift(Image_b) ;
[matches, scores] = vl_ubcmatch(da, db) ;
Run Code Online (Sandbox Code Playgroud)

最后,我想计算冒充者和真实分数,然后我想计算 EER。

我想提请您注意,我不想使用以下任何方法:

  1. Matlab 中的 VLfeat
  2. BoW(Bag of word)算法(sift 中的欧几里得距离)
  3. SIFT 解释分数中的答案

谢谢。

这就是我提取 SIFT 关键点和描述符的方法:

import cv2
def extractFeatures_SIFT(Imagelist):
    l = len(Imagelist)
    featurlist = []
    for img_path in Imagelist:
        img = img_path
        img = cv2.imread(img)
        sift = cv2.xfeatures2d.SIFT_create()
        (kps, descriptor) = sift.detectAndCompute(img, None)
        featurlist += [kps, descriptor]

    return featurlist
Run Code Online (Sandbox Code Playgroud)

Sak*_*eek 6

由于不同图像中检测到的关键点不同,图像中 SIFT 描述符的数量也不同。在您的例子中,图像 A 有 16 个关键点,图像 B 有 10 个关键点。为每个关键点计算 128 个值的 SIFT 描述符,因此图像 A 和 B 分别获得总共 2048 个和 1280 个描述符值。

注意,2048和1280不是描述符的数量,而是图像A和B的描述符中的值的数量。图像A有16个描述符,图像B有10个描述符。关键点和描述符的这种差异很常见,因为不同的图像具有不同数量的可以被检测为关键点的有趣点。

这种差异不会对查找它们之间的相似性造成问题,因为当您通过 BFMatcher 和 FlannBasedMatcher 等匹配函数传递描述符时,您只能得到仅组合两个图像中相同数量的描述符的描述符匹配。通常,匹配的长度将等于最短描述符的长度。(在您的情况下,您将获得 10 个匹配)

接下来,从这 10 个匹配中,您必须使用David G.Lowe 给出的交叉检查比率测试来删除不必要的和近似的匹配,并仅过滤掉好的匹配。即使如此,您也可能会出现误报匹配。根据图像和您的应用程序,可以使用单应性或任何其他自定义方法进一步删除这些内容。

经过所有这些过程后,您将获得最终的比赛。您可以通过设置阈值,使用最终匹配的数量来测试两个图像之间的相似性。如果最终匹配的数量高于设定的阈值,则图像相似。如果最终匹配的数量小于设定的阈值,则图像不同。

就您而言,即使在开始时,您也只能处理 10 个匹配项。因此,当您完成上述所有过程并过滤掉匹配项时,您将留下很少的最终匹配项,您无法设置合理的阈值来获得所需的结果。因此,您可能必须在开始时增加检测到的关键点的数量。

这可以通过在SIFT_create()函数的“ contrastThreshold ”(默认值 = 0.04)和“ edgeThreshold ”(默认值=10)中传递较低的值来完成[对于 OpenCV 3]。您还可以通过在“ nFeatures ”参数中传递合适的值来限制关键点的数量。

或者,要增加关键点,您可以尝试其他算法,例如 SURF、ORB...来检测关键点,然后使用这些关键点来计算这些关键点的 SIFT 描述符

希望我的回答对你有帮助。