Python中的聚类——图像聚类

Posted

技术标签:

【中文标题】Python中的聚类——图像聚类【英文标题】:Clustering in Python- Image Clustering 【发布时间】:2017-08-28 09:41:23 【问题描述】:

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

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

现在,当我使用 K 均值聚类时,提供 n_clusters = 3,它显示此错误:

从 sklearn.cluster 导入 KMeans kmeans = KMeans(n_clusters = 3).fit(img_array) 错误 = 找到暗淡为 4 的数组。估计器预期

现在,我需要您的帮助来解决这个集群问题。我创建的数据框如下所示

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)

【问题讨论】:

【参考方案1】:

发生这种情况是因为您在预期 2-dim 时传递了 4-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

【讨论】:

我需要更多解释,你能给我提供你的代码吗?此时,我正在考虑如何将数组转换为另一个二维数组,该数组每行都有均值和标准差,Kmeans 可以得到 我也在尝试同样的事情,但是有一些问题吗?数组是 4D,使用 np.mean(axis =2),我们切断了第四个暗淡,然后我再次使用 axis = 0。我们切了另一个暗淡。现在它是一个二维数组,将被 K MEANS 接受,但是,我很困惑,这样做是否正确?如果我们使用 ndarray.flatten 切入一维数组并获得均值呢?? 我无法使用它,我所做的是,我通过分别在轴 = 0 和轴 = 2 处获取 np.mean 将 img_array 转换为二维数组。现在但我的课程是300。分别应用axis = 0,2之后。但是我的数据集只有 24 个实例,我做错了吗? img_array.shape = (24, 300, 400, 3)【参考方案2】:

正如您所说,k-means 希望每个输入都有一个向量,而您为每个图像提供一个 3d 数组。解决此类问题(确实需要一些创造力)的最简单方法是设计一组特征来区分您拥有的类。

由于在这种情况下,您希望在自然(很多是绿色)、水(很多是蓝色)和日落(很多是阅读/黄色/粉红色)之间进行分类,您可以使用总的或平均的绿色蓝色和红色值。要检查您选择的特征是否具有区分性,您可以绘制直方图。

从您的 4D(图像 x 宽度 x 高度 x 颜色)数组转换为 2D(图像 x 平均颜色)数组。您需要在颜色、高度和宽度维度上使用 np.mean。最后你应该有一个 (images x 3 (colours)) 数组。

【讨论】:

是的,这看起来很有趣。但我卡住了,你能帮我解决这个问题吗?如何获取直方图(我实际上也试图得到它)。现在,我试图用平均值代替 3D 数组。如果您能提供更多帮助,那将非常有帮助。 我正在考虑将这个 3D 数组转换为具有均值和标准差的 2D 数组,当我运行 K 均值时可以,但是这个数组是 RGB 数组。我的意思是如何做到这一点? np.mean(image_arrays,axis=2)? docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html 我也在尝试同样的事情,但是有一些问题吗?数组是 4D,使用 np.mean(axis =2),我们切断了第四个暗淡,然后我再次使用 axis = 0。我们切了另一个暗淡。现在它是一个二维数组,将被 K MEANS 接受,但是,我很困惑,这样做是否正确?如果我们使用 ndarray.flatten 切入一维数组并获得均值呢?? 如果你做后者,你也会得到颜色的平均值,这可能会导致大量数据丢失。

以上是关于Python中的聚类——图像聚类的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit 选择层次凝聚聚类中的聚类数

动态选择聚类中的聚类数[关闭]

k-means 聚类中的项数

Python中的聚类文本[关闭]

k-means聚类算法python实现,导入的数据集有啥要求

Python中的聚类