Python中的聚类 - 图像聚类

时间:2017-04-03 13:32:48

标签: python machine-learning cluster-analysis

我想使用K Means或其他算法对图像进行聚类(需要建议)。

问题是这样的 - 我想将图像聚类成3个聚类(自然,日落,水)。我使用os.listdir()加载所有图像,然后将所有图像转换为数组(RGB),然后创建一个包含三列的数据框--ID,Image_array,Label。

现在,当我使用K Means聚类时,提供n_clusters = 3,它会显示以下错误:

  

来自sklearn.cluster导入KMeans   kmeans = KMeans(n_clusters = 3).fit(img_array)   ERROR =找到带有暗淡的数组4.预期估算值<= 2。

现在,我需要你帮助解决这个群集问题。我创建的数据框看起来像这样

img_array = []

path = "C://Users/shivam/Desktop/freelancer/p22/data/green_nature/"
for f in os.listdir('.'):
    if f.endswith('.jpg'):
        img = Image.open(f)
        data = np.asarray(img, dtype='uint8')
        img_array.append(data)


df = pd.DataFrame({'image_arrays':img_array})
df['id'] = range(1, len(df) + 1)

2 个答案:

答案 0 :(得分:0)

正如你所说,k-means想要每个输入一个向量,而你为每个图像提供一个3d数组。解决这类问题(这确实需要一些创造力)的最简单方法是设计一套对你所拥有的课程进行描述的功能。

因为在这种情况下你想要在自然(很多是绿色),水(很多是蓝色)和日落(很多可读/黄色/粉红色?)之间进行分类,你可以使用总蓝色或平均绿色蓝色和红色值。要检查您选择的要素是否具有辨别力,可以绘制直方图。

从您的4D(图像x宽x高x颜色)数组转到2D(图像x平均颜色)数组。你需要在颜色,高度和宽度的diminsions上取np.mean。最后你应该有一个(图像x 3(颜色))数组。

答案 1 :(得分:0)

这种情况发生的原因是你通过了4-dim数组,而预期是2-dim。 'img_array.shape'应该是这样的(n_samples,n_features)。 您需要使用特征提取算法。

这可以通过scikit-image模块完成。 您需要将图像转换为灰度格式。 代码:

import skimage.feature as feature
img_converted = []
for i in range(len(img_array)):
    img_converted.append(feature.hog(img_array[i]))
model.fit(np.array(img_converted))

文档:http://scikit-image.org/docs/dev/api/skimage.feature.html#hog