使用 sklearn 库中的 KMeans 实现彩色图像聚类分割

如题所述

第1个回答  2022-07-16

sklearn 库是最为常用且经典的机器学习库,里面封装了许多机器学习算法,此篇文章使用此库中的 KMeans 算法,从而实现图像的聚类分割。

本文不讲理论,只谈应用。

除了 sklearn 库之外,还需要一些图像处理的库,我引入了如下几个库:

我使用了 pylab 库来读入图片:

此时读入的 img 是一个三维 numpy 数组,其形状为 (height, width, 3) ,其中3是指通道数,即 RGB 三个通道。

但是, KMeans 传入的参数必须是二维数组,故,还需要将其打散为二维:

在此构建时,只需要使用最简单的方法即可:

参数有很多,我在构建的时候除了 n_clusters 都使用的默认值:

然后,使用 fit() 进行训练:

聚类之后,有很多参数,比较重要的,以及此处需要用到的主要有俩:

聚类完成之后,需要将每个像素点重新填色,将同一类的像素点均填为此类聚类中心的颜色。

在此之前,首先需要得到图片的高度和宽度:

首先用 image.new() 重新创建一个图片,其语法如下:

然后需要用 putpixel() 方法来填充像素,但是在此之前,还需要处理几个小细节:

RGB图中,每个通道都是 0-255 之间的整数,但是, kmeans.cluster_centers_ 中元素类型却是 float64 ,故在填充之前,还需要小小处理一番,将元素变为 int32 类型的。

直接转变类型不太合适,因为 kmeans.cluster_centers_ 毕竟是类似于一个属性值的东西,而且这个名字太长,换一个简短的也是好的。故重新复制一份再使用 astype 更改数据类型即可。

上面便提到, kmeans.labels_ 是一个一维数组,但是图片是二维的,所以将其恢复过来即可:

然后便可以 填充像素 了:

这里需要注意 putpixel() 方法,其的两个参数:

最后保存图片即可:

我使用了王者荣耀大乔的图片来做测试:

相似回答
大家正在搜