将SURF特征列表转换为Numpy数组以进行KMeans聚类的方法

2024-05-21 00:10:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Numpy和sklearn构建一个单词包工作流。在

我想限制openCV的使用仅限于冲浪检测和提取。我知道openCV中有一个BOW类,但是缺少文档(针对Python),我希望构建工作流,以便真正理解其中的几个步骤。在

到目前为止,我能够将我的图像分离到训练集和测试集中,并在训练图像上运行SURF,创建一个特性列表(dscList)。在

[trnImgs, testImgs, trnTargets, testTargets] =
    train_test_split(imgPaths, imgLabels, test_size=0.7,
                     train_size=0.3, stratify=imgLabels)

surf = cv2.xfeatures2d.SURF_create()

dscList = []
for trnImg in trnImgs: # trnImg is a path to an image
    img        = cv2.imread(trnImg, 0)
    (kps, dsc) = surf.detectAndCompute(img, None)
    dscList.append((trnImg, dsc))
    print("# kps: {}, dsc: {}".format(len(kps), dsc.shape))

输出如下:

^{pr2}$

我知道下一步是创建一个Numpy数组,然后提交给sklearn的KMeans。在

我想知道你能不能帮我做这些步骤:

Numpy数组:我不确定这是否正确地构建了np数组descriptors

descriptors = dscList[0][1]
    for trnImg, descriptor in dscList[1:]:
    descriptors = np.vstack((descriptors, descriptor))

sklearn KMeans:也不确定如何实施

k_means = cluster.KMeans(n_clusters=n_clusters, n_init=4)
k_means.fit(descriptors)
values = k_means.cluster_centers_.squeeze() # <=== is squeeze necessary?
labels = k_means.labels_

Tags: 图像numpy步骤数组sklearnopencvsurfmeans