在 Python 中使用 K-Means 聚类对指定图片(lena.jpg)实现压缩,并通 过选取不同的聚类中心数来调整压缩的比例。(“KMeans.ipynb”中已经完成了图片加载 及可视化函数,
时间: 2024-02-27 12:51:37 浏览: 104
您的问题是如何在 Python 中使用 K-Means 聚类对指定图片实现压缩,并通过选择不同的聚类中心数来调整压缩的比例。
首先,您需要安装 scikit-learn 库,因为它包含了 K-Means 的实现。
然后,您可以使用以下代码对指定的图片进行压缩:
```python
import numpy as np
from sklearn.cluster import KMeans
from PIL import Image
# 加载图片并转换为 numpy 数组
img = Image.open('lena.jpg')
img_data = np.array(img)
# 将图片数据重塑为二维数组
width, height, channel = img_data.shape
img_data = img_data.reshape(width*height, channel)
# 使用 K-Means 对像素进行聚类
kmeans = KMeans(n_clusters=16)
kmeans.fit(img_data)
# 将每个像素替换为其所属聚类的中心值
compressed_img_data = kmeans.cluster_centers_[kmeans.labels_]
compressed_img_data = np.uint8(compressed_img_data.reshape(width, height, channel))
# 保存压缩后的图片
compressed_img = Image.fromarray(compressed_img_data)
compressed_img.save('lena_compressed.jpg')
```
在上面的代码中,将图片数据重塑为二维数组的目的是为了方便调用 K-Means 函数。
您可以尝试不同的聚类中心数来调整压缩比例。在代码中,我们使用了 `n_clusters=16`,这意味着我们将像素分为 16 个簇,从而产生较高的压缩比。如果您想要更高质量的压缩,请增加聚类中心数。
注意,这种方法可能会导致压缩后的图像损失一些细节和质量。
阅读全文