繁体   English   中英

如何使用SIFT从数据集中提取相同大小的特征向量?

[英]How to extract features vectors of same size from a dataset using SIFT?

我开始学习机器学习和计算机视觉,但此刻我有些怀疑。

我有一个包含1000张不同大小图像的数据集,我想使用SIFT和OpenCV创建特征矩阵(我正在使用python)。 问题是我注意到SIFT为每个图像提取了不同数量的关键点,因此我获得了不同大小的特征向量(我编写了此简单代码来理解它)

sift = cv2.xfeatures2d.SIFT_create()    
for file in listing:
        img = cv2.imread(iDir+file)
        gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        kp = sift.detect(gray, None)
        kp2, des = sift.compute(gray,kp)
        print(len(kp2))

现在我的问题是:用SIFT提取后,我是否必须对特征数量进行规范化(如何选择最佳特征数量?)还是必须使用特定参数? 谢谢你的帮助。

每个图像的关键点(或SIFT点)数将改变。 SIFT的想法是在许多条件下找到可识别的关键点。 实际上,尽管缩放,旋转和照明有所不同,这些关键点仍应可识别。 自然,某些图像将具有更少或更多的这些关键点。

可以将其视为其他任何功能。 假设您的功能是红色圆圈。 有些图像会有很多,而有些则很少或根本没有。 这并不意味着有任何问题。 只是意味着图像具有不同的属性。

当您希望找到图像之间的相似性时,可以对关键点描述符进行成对比较。 描述符是分配给每个关键点的128x1向量。 如果两个关键点具有匹配的描述符(具有一定的容忍度),则称它们匹配。

如果我们回到我们的红色圆圈功能示例。 我们对圆的描述可以是其半径。 如果要比较两个图像,则必须查看描述符,而不是找到的特征数量(半径)。 如果图像A有2个圆圈,图像B有3个圆圈,我们将它们成对比较以找到匹配项。

A1半径1; B1半径3,不一样

A1半径1; B2半径2,不一样

A1半径1; B3半径1.5,可能相同

A2半径2; B1半径3,不一样

A2半径2; B2半径2,相同

A2半径2; B3半径1.5,可能相同

如您所见,功能数量不同是可以的,重要的是描述符是相同的(对于SIFT,这是事实)

您不必更改关键点的数量,除非可能会减少存储量并减少搜索时间。 如果要减少每个图像的关键点数量,可以设置一个阈值作为阈值_size of _size open cv可以访问每个关键点大小和角度,您只能保留“大”关键点,从而减少每个关键点的总数图片

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM