使用Kmeans进行图像聚类

Kmeans可以用于与发现聚类相关的其他任务 

4761065a6a4b12273ba86f6f4792c4f7.jpeg

介绍

聚类是一种无监督机器学习技术。这意味着您的数据集没有标签,即与解释变量发现的模式关联的目标变量。

无监督学习是找到看似相似的模式并将它们放入同一个桶中的过程。

最常用的无监督学习算法之一是Kmeans,用于聚类。使用它,可以对常规数据进行聚类,还可以执行其他任务,例如图像中的颜色聚类以及用于进一步分类的降维。

让我们更详细地了解一下。

Kmeans

Kmeans 是一种基于质心的聚类算法。换句话说,当它执行任务时,它将基于每个聚类的中心点和每个数据点与聚类中心的距离做出所有决策。观察与聚类中心之间的距离越小,它属于该聚类的概率就越高。

该算法计算点之间的欧氏距离,而聚类将具有圆形形状,基本上是Kmeans的一个缺点。毕竟,并不是所有模式都会创建圆形形状,对吧?但使用Kmeans进行数据聚类非常简单。您只需将数据集输入算法并定义要使用的聚类数量。其余部分是自动的。

from sklearn.cluster import KMeans
# Number of clusters
n = 3
# Fit and predict clusters
kmeans = KMeans(n_clusters= n).fit_predict(your_data)

现在让我们学习一下我们可以使用Kmeans做的其他有趣事情。

图像聚类

首先要学习的是图像聚类。使用Kmeans,我们实际上可以将图像分离为不同的颜色。看看为此练习创建的这张图片。

178112aad50227a2021b135e7e51acd8.png

接下来,我们可以从matplotlib.image读取图像。创建的对象将是一个三维数组,具有高度、宽度和第三个维度,其中包含像素的颜色红色、绿色和蓝色(RGB)的数量。然后,我们将重塑图像,使其成为Kmeans可解释的像素的平坦数组。

# Read image
image = imread('/content/test_image.png')
# Reshape for KMeans
X = image.reshape(-1,3)

接下来,让我们对其进行聚类。我们可以想象,由于有3种颜色,因此最佳的聚类数量将为3。我们必须尝试一下。

# cluster
kmeans = KMeans(n_clusters = 3).fit(X)

在这里,Kmeans试图识别我们图片中存在的颜色并将它们组合在一起。所以,由于我们看到了红色、绿色和黄色,想法是:

  • 该算法将根据我们的要求创建3个单独的桶。

  • 识别颜色相似的像素,并创建一个平均的“标签”颜色,以将所有相似的色调放入同一个桶中。因此,所有绿色色调放在一起,所有黄色色调放在一起,以此类推。

我们的下一步是获取cluster_centers_,这些是每个桶的“平均颜色标签”,然后使用该新的平均颜色覆盖原始颜色。然后我们将其重塑为原始图像的大小。

# Segmenting the colors
segmented_img = kmeans.cluster_centers_[kmeans.labels_]
segmented_img = segmented_img.reshape(image.shape)

现在让我们将图像并排绘制在一起进行比较。

# Setup figure size
plt.figure(figsize=(18,10))
# clustered image
plt.subplot(121)
plt.imshow(segmented_img)
#original image
plt.subplot(122)
plt.imshow(image)

5e25cf91ec101683b5fd2c4c49122e05.png

3个聚类的图像(左)和原始图像(右)


在这里,我们使用了3个聚类中心点。但是我们可能忘记考虑白色背景了。因此,红色和黄色被粘在一起,放在“橙色”桶下,这是两种颜色之间的混合(平均)颜色。很神奇,不是吗?现在让我们尝试将聚类的中心点设置为4个,再次比较结果。

# cluster
kmeans = KMeans(n_clusters = 4).fit(X)
segmented_img = kmeans.cluster_centers_[kmeans.labels_]
segmented_img = segmented_img.reshape(image.shape)
# Setup figure
plt.figure(figsize=(18,10))
# clustered image
plt.subplot(121)
plt.imshow(segmented_img)
plt.title('Reconstructed image with 4 clusters')
#original image
plt.subplot(122)
plt.imshow(image)
plt.title('Original Image');

779f9cf67e7a48766e3149f0b697b98e.png

4个聚类的图像(左)和原始图像(右)

·  END  ·

HAPPY LIFE

f337a675b5bfa7f0982564635e6ee7d9.png

本文仅供学习交流使用,如有侵权请联系作者删除

猜你喜欢

转载自blog.csdn.net/weixin_38739735/article/details/132705650