Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 图像检测特征:SIFT、直方图和EGDE_Opencv_Image Processing_Histogram_Sift - Fatal编程技术网

Opencv 图像检测特征:SIFT、直方图和EGDE

Opencv 图像检测特征:SIFT、直方图和EGDE,opencv,image-processing,histogram,sift,Opencv,Image Processing,Histogram,Sift,我正在开发一个对象分类器,使用3种不同的特征,即SIFT、直方图和EGDE 然而,这3个特征具有不同的维度向量,例如SIFT=128维度。历史=256 现在,由于大小不同,这些特征无法连接到一个向量中。我计划这样做,但我不确定这样做是否正确: 对于每个特征,我分别训练分类器,然后对3个不同的特征分别应用分类,然后计算多数,最后以多数票宣布图像 您认为这是一种正确的方法吗?有几种方法可以获得考虑多种特征的分类结果。您所建议的是一种可能性,您可以通过某种协议训练多个分类器,而不是组合特征,从而在它们

我正在开发一个对象分类器,使用3种不同的特征,即SIFT、直方图和EGDE

然而,这3个特征具有不同的维度向量,例如SIFT=128维度。历史=256

现在,由于大小不同,这些特征无法连接到一个向量中。我计划这样做,但我不确定这样做是否正确:

对于每个特征,我分别训练分类器,然后对3个不同的特征分别应用分类,然后计算多数,最后以多数票宣布图像


您认为这是一种正确的方法吗?

有几种方法可以获得考虑多种特征的分类结果。您所建议的是一种可能性,您可以通过某种协议训练多个分类器,而不是组合特征,从而在它们之间达成共识。这通常属于集成方法领域。尝试谷歌搜索增强随机森林,了解如何组合分类器的更多细节

但是,由于特征向量具有不同的维度,因此不能将其连接起来,这是不正确的。您仍然可以将这些特征连接到一个巨大的向量中。例如,将您的SIFT和HIST特征结合在一起将得到384维的向量。根据您使用的分类器,您可能必须规范化向量的条目,以便没有一个特征仅仅因为通过构造它具有更大的值而占主导地位

编辑以回应您的评论: 直方图似乎是描述整个对象特征(例如颜色)的某个特征向量,而SIFT描述符是在该对象的局部兴趣关键点提取的。由于SIFT描述符的数量可能因图像而异,因此不能将其直接传递给典型分类器,因为它们通常会为每个要分类的样本提取一个特征向量。在这种情况下,您必须使用从许多图像中提取的SIFT描述符构建一个码本(也称为视觉词典)。然后,您将使用此代码本帮助您从从每个图像提取的多个SIFT描述符中导出单个特征向量。这就是所谓的“视觉文字袋”(BOW)
”模型。现在您有了一个“总结”SIFT描述符的向量,您可以将它与直方图连接起来,形成一个更大的向量。现在,此单个向量汇总了整个图像/(图像中的对象)

有关如何构建单词包码本以及如何使用它从每个图像提取的多个SIFT描述符中导出单个特征向量的详细信息,请参阅本书(可从作者网站免费下载)“搜索图像”一章下的内容。这实际上比听起来简单得多

大致上,只需运行KMeans对许多图像中的SIFT描述符进行聚类,并将它们的质心(称为“视觉单词”的向量)作为码本。例如,对于K=1000,您有一个1000个可视单词的代码本。然后,为每个图像创建一个与K大小相同的结果向量(在本例中为1000)。该向量的每个元素对应一个可视词。然后,对于从图像中提取的每个SIFT描述符,在码本中找到其最接近的匹配向量,并在结果向量中增加相应单元格中的计数。完成后,此结果向量基本上统计不同视觉单词在图像中出现的频率。对于相同的视觉单词,相似的图像将具有相似的计数,因此该向量有效地表示您的图像。您还需要“规范化”该向量,以确保具有不同数量的SIFT描述符(以及总计数)的图像具有可比性。这可以很简单,只需将每个条目除以向量中的总计数,或通过更复杂的度量,如本书中所述的tf/idf

我相信作者也会在他的网站上提供python代码来与本书一起使用。如果你不确定的话,可以看一看或者尝试一下


更复杂的组合特征的方法包括多核学习(MKL)。在本例中,计算不同的内核矩阵,每个矩阵使用一个特性。然后找到组合核矩阵的最佳权重,并使用组合的核矩阵来训练SVM。您可以在幕府机器学习库中找到这方面的代码。

谢谢您对我的问题的精彩回答。对于您提到的MKL方法,它看起来很有趣,因为我不想知道这一点。对于您提到的第二种方法,我们在其中进行了组合。我正在使用OpenCV,例如,一幅使用sift的图像具有[128 x 34]特征向量大小,直方图具有[256 x 1]。我试着把它们结合起来,但做不到。这就是为什么我觉得它不能结合在一起。我做错什么了吗?再次感谢您。我在回复您的回复时添加了详细信息。顺便说一句,即使使用MKL,您也可能需要将许多SIFT描述符简化为一个向量来使用它。部分原因是不同的图像会给出不同数量的SIFT描述符。除非您直接匹配SIFT描述符,否则分类器通常无法为每个样本(即图像)处理不同数量的特征向量。@rish感谢您的好话。关于将SVM用于弓,当然可以。BOW只是一种表示数据的方式。之后,你可以使用任何分类器来分类你的数据,无论是支持向量机,随机森林。。。关于MKL,我建议理解支持向量机是如何工作的,特别是在支持向量机中使用内核(矩阵)。内核矩阵的(i,j)项本质上存储了第i个和第j个样本之间的相似性度量。MKL基本上解决了如何优化组合多个核矩阵(为每个特征创建一个)并在SVM中使用它。看看幕府马赫