用机器学习中的K-Means方法压缩图片,让你的图片更小更美

本文将介绍一种利用机器学习中K-Means方法对图像进行压缩处理,random_state=0).fit(color_arr)最后将原始图片中每个像素的RGB值替换为所属簇内的质心,

在如今的数字时代,我们每天都会接触到各种各样的图片。从社交媒体上朋友们分享的照片,到商家们发布的商品图片,再到新闻媒体上报道事情时所用到的图像等等。而这些大量使用的图片不仅占据了我们手机和电脑存储空间,也占据了我们生活和工作中很多重要信息传递方式。

然而,在现实生活中我们常常会遇到一些问题:当你需要发送一张高清晰度大尺寸照片给朋友或上传至网站时,它往往因为太大而无法传输;或者当你想要在一个网站上展示自己产品时又因为加载速度过慢影响用户体验。这些问题都源于原始图像文件太大。

那么有没有什么方法可以解决这个问题呢?答案是有!本文将介绍一种利用机器学习中K-Means方法对图像进行压缩处理,并且保证画质不损失明显、大小变得更小、加载速度变得更快。

## K-Means算法

K-Means是机器学习中的一种聚类算法,它是将n个样本分成k个簇的一种方法。在图像处理上,我们可以把每一个像素看作是一个特征向量,并且这些像素点可以被分为不同的簇。

K-Means算法步骤:

1. 随机选择k个点作为初始质心。

2. 将数据集中的每个点分配到最近的质心(距离度量通常采用欧氏距离)。

3. 根据已经分配好的数据点重新计算每个簇质心。

4. 重复步骤2和3直到所有数据点都被重新分类,或者达到预先设定好迭代次数。

## 图片压缩

对于一张图片而言,它由众多像素组成。如果我们使用K-Means算法对这些像素进行聚类,那么就能够将相似颜色值降至同一个簇内。在这里我们以256色图片为例子来说明。

首先加载原始图片:

![原始图片]()

接着把它转化为RGB格式,并且获取其中所有颜色值:

“`python

from PIL import Image

import numpy as np

# 加载原始图片

img = Image.open(‘test.jpg’)

# 转换为RGB格式

img_rgb = img.convert(‘RGB’)

用机器学习中的K-Means方法压缩图片,让你的图片更小更美

# 获取所有像素点的颜色值

color_arr = np.array(img_rgb).reshape(-1, 3)

“`

然后使用K-Means算法对这些颜色值进行聚类:

from sklearn.cluster import KMeans

# 聚类数量为256

kmeans = KMeans(n_clusters=256, random_state=0).fit(color_arr)

最后将原始图片中每个像素的RGB值替换为所属簇内的质心,即可得到压缩后的图片:

# 获取所有簇质心颜色值

color_center_arr = kmeans.cluster_centers_.astype(int)

# 将原始图片中每个像素点替换成所属簇内质心颜色值,生成新图片并保存

img_new_arr = np.array(img_rgb)

for i in range(len(color_arr)):

img_new_arr[i // img.width][i % img.width] = color_center_arr[kmeans.labels_[i]]

img_new = Image.fromarray(np.uint8(img_new_arr))

img_new.save(‘test_compressed.jpg’)

看一下压缩后的效果:

![压缩后图片]()

可以看出,虽然经过了一定程度上的压缩处理,但是在肉眼观察下画面并没有明显变形或者失真。同时新生成文件大小也从2.6MB降至360KB。

## 总结

本文介绍了如何利用机器学习中的K-Means算法对图片进行压缩处理,以减小文件大小并提高加载速度。实现过程分为三步:获取原始图片颜色值、使用K-Means算法对颜色值聚类、将原始图片中每个像素点替换成所属簇内质心颜色值,生成新图片。通过这种方法可以保证画质不损失明显的情况下大幅度降低文件大小。

最后,希望读者们可以在自己的项目中尝试使用该方法,并且产生更多创意和优化操作。