基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

聚类算法

在机器学习十大算法中,聚类算法是一种重要的无监督的学习算法,它可以将数据集中的样本点归结为一系列特定的组合。训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质和规律,最常用的就是“聚类”算法

聚类算法的应用

电子商务平台的卖家需要将客户分成不同的客户群,这样卖家可以对不同类型的客户分别销售产品,这就是聚类算法在市场分割中的作用。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

市场分割

大型的互联网企业一般都有自己的服务器机房来保证软件和网站的运行,这么大的计算机集群,我们可以使用聚类算法看看哪些计算机经常一起协作,然后重新布局,更好的统一管理。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

计算机集群管理

星系是怎么形成的,很多天文学家对此都不知疲倦的研究,而聚类算法也可以应用在天文学中帮助天文学家了解到星系形成的原因。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

聚类算法了解星系的形成原因

常用的聚类算法——K均值算法

K均值(K-Means)聚类是一个迭代算法,假设我们想要将数据聚类成k个组,其方法为:

第一步:首先选择 k 个随机的样本点,称为聚类中心。

第二步:遍历数据集中的每一个数据,计算距离 K 个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。

第三步:计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。

第四步:重复执行2-3步,直至中心点不再变化。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

聚类算法的过程

k均值算法完成彩色图片压缩操作

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

彩色图片

我们现在有如上所示一张彩色图片,我们知道有些彩色图片所占硬盘空间太大,那么我们可以对其进行压缩操作,我们使用k均值算法来对其进行压缩操作。k均值算法实现图像的压缩是均值聚类算法的一个经典的应用,它把一个彩色图变成了灰度图,灰度图不再使用三个通道,而使用单通道图,也就是变成了灰度图。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

k均值压缩之后的效果

如上所示就是k均值算法压缩彩色图之后的效果,我们还是可以隐约的看出来一些原来彩色图的轮廓,这样的图片称为灰度图,它比彩色图所占的硬盘空间要小很多,如此这样就实现了压缩的操作。

k均值算法压缩彩色图片的原理

一张彩色图片是由红、绿、蓝三种颜色通道构成的,也就是说一张彩色图片可以切分为空间中的三张,也就是红色通道一张、绿色通道一张、蓝色通道一张,这三张叠加在一起就构建了原来彩色图像。

基于机器学习聚类算法K-means完成经典的压缩彩色图像的操作

一张彩色图片的红绿蓝三通道

无论是哪个通道都是由一个一个的像素点构成的,像素值的范围为0~255,分别对应其红、绿、蓝三种颜色的色彩强度,所以彩色图像中每个像素点都右3个像素值表示 。我们可以将彩色图像样本化,其中每一个彩色像素点为一个样本,那么这个像素点的红、绿、蓝三通道的像素值作为这个样本的特征,也就是说我们的这个彩色图片中有多少像素点就有多少样本,每个样本有三个特征。

每个特征的值的范围是0~255,下面我们使用聚类算法,将这些个样本聚成128簇。为什么要聚成128呢?

因为我们知道,我们的特征值的范围是0~255,这就相当于是256个可能,我们聚成128个簇,以后的每个样本所属的簇就作为压缩图片的像素值了,那么像素值最大为128,所以图像就压缩了。

算法的具体过程为:

第一步:取聚类个数K=128

第二步:随机产生K个初始中心作为颜色聚类初始中心点

第三步:迭代开始,枚举图像中所有像素点,对每个像素点计算其颜色到所有K个中心点的距离,选取距其最近的中心点所代表的聚类作为该像素点颜色的聚类

第四步:在所有像素点确定其颜色的新聚类后,更新每个颜色聚类的新中心点(求平均值)

第五步:重复3、4直到最大迭代次数

k均值算法压缩彩色图片的代码实现

from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image = io.imread('caise.jpg')
rows = image.shape[0]
cols = image.shape[1]
image = image.reshape(image.shape[0]*image.shape[1],3)
kmeans = KMeans(n_clusters=128, n_init=10, max_iter=200)
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8)
labels = labels.reshape(rows, cols);
io.imsave('yasuo.jpg', labels)
image = io.imread('yasuo.jpg')
io.imshow(image)
io.show()

至此我们就完成了经典的聚类算法——k-means算法的理论到实践(压缩彩色图片)的应用。

相关推荐