我想用C ++将脑肿瘤的MRI图像分类为良性和恶性。我正在使用SIFT功能和我正在关注的论文在训练SVM分类器之前使用kmeans对它们进行聚类。我不明白为什么需要这样做?据我所知,kmeans只对特征进行聚类;它不会改变输入的大小。
我已经读过可能的方法是BoW和直方图。 在直方图方法中,它只计算每个群集中的功能数量吗?我不认为这将提供我对分类良性和恶性肿瘤所需的信息,因为它们既小又大。 在BoW方法中,我不理解这个link。
基本上,我不知道如何处理我的SIFT功能,将其用作SVM的输入。我真的要创建某种字典吗?我求求你,请赐教。非常感谢你!
答案 0 :(得分:3)
我对OpenCV或SIFT功能不太熟悉,但这应该足够通用,对所有编程语言都有用。我还将仅描述下面的BoW方法。
我们假设我们有N
张图片。对于每个图片i
,我们有F
个要素,每个要素都有D
个尺寸。我们可以将所有功能放入数组feats
中,以便它看起来像这样:
[1, 2, ..., D]
[..., ..., ..., D]
[N*F, ..., ..., D]
feats
的每一行都是一个功能,尺寸为D
,我们总共有N*F
个功能。
在k-means中,我们采用所有这些功能并将它们分组到k
个群集中。因此,每个功能都分配给一个群集。大多数k-means函数通常返回大小为C
的矩阵k x D
,其表示聚类的质心。该矩阵C
是"代码簿"或"字典" k均值算法。有些还会返回大小为N*F
的向量,该向量会显示每个要素分配给哪个群集(在OpenCv中,这由此链接中的labels
变量表示:http://www.developerstation.org/2012/01/kmeans-clustering-in-opencv-with-c.html)。
由于我们已经拥有了所有功能的分配,因此每个图片i
都有F
个功能,可以简单地用它们所属的群集来表示。例如,如果原始图像表示为
[1, 2, ..., D]
[..., ..., ..., D]
[F, ..., ..., D]
然后图像也可以简单地表示为矢量:
[1] % Assignment of feature 1
[...]
[F] % Assignment of feature F
因此,您可以使用此向量并形成所表示的聚类的直方图h
。此直方图是图像的特征向量,稍后可以在SVM中使用。
P.S。如果您需要任何进一步的说明和/或示例,请告诉我们!