我使用openCV python使用python 2.7计算了图像A和B的SIFT描述符。图像A具有16X128(= 2048)个描述符,图像B具有10X128(= 1280)。现在我卡住了因为我不知道如何产生相似度得分。如果你能帮助我,我将不胜感激。
得分或相似项是一对匹配描述符之间的度量(例如欧几里德距离)但是将图像中的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) ;
最后,我想计算冒名顶替和真实分数然后我想计算EER。
我想请你注意我不想使用以下任何一种方法:
谢谢。
这就是我提取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
随着在不同图像上检测到的关键点变化,图像中的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()函数[对于OpenCV 3]的'contrastThreshold'(默认值= 0.04)和'edgeThreshold'(默认值= 10)中的较低值来完成。您还可以通过在“nFeatures”参数中传递合适的值来限制关键点的数量。
或者,要增加关键点,您可以尝试其他算法,如SURF,ORB,...来检测关键点,然后使用这些关键点计算这些关键点的SIFT描述符
希望我的回答可以帮到你。