帮我写一份题目是:使用K-means 聚类算法压缩图像的实验报告
时间: 2024-02-03 19:11:51 浏览: 81
好的,以下是一份使用 K-means 聚类算法压缩图像的实验报告。
# 实验目的
本实验旨在探究使用 K-means 聚类算法对图像进行压缩的效果,并比较不同聚类数(K值)对压缩效果的影响。
# 实验原理
K-means 聚类算法是一种常用的无监督学习算法,其基本思想是将数据集划分为 K 个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。在图像压缩中,我们可以使用 K-means 算法将图像中的像素点划分为 K 个簇,然后用每个簇的中心点代表该簇内的所有像素点,从而实现图像的压缩。
具体实现步骤如下:
1. 读取图像,并将其转换为二维数组;
2. 将像素值归一化到 [0, 1] 区间内;
3. 将二维数组转换为一维数组,并将其作为输入数据进行 K-means 聚类;
4. 根据聚类结果,将每个像素点替换为对应簇的中心点;
5. 将处理后的像素点重新组合成二维数组,并保存为图像文件。
# 实验步骤
1. 准备数据集
我们选用了一张分辨率为 512x512 的彩色图像作为数据集。图像如下所示:
![原始图像](原始图像.png)
2. 数据预处理
我们将图像转换为二维数组,并将像素值归一化到 [0, 1] 区间内,代码如下:
```python
import numpy as np
from PIL import Image
# 读取图像并转换为二维数组
im = np.array(Image.open('lena.png').convert('RGB'))
# 将像素值归一化到 [0, 1] 区间内
im = im / 255.0
# 将二维数组转换为一维数组
data = im.reshape(-1, 3)
```
3. K-means 聚类
我们使用 scikit-learn 库中的 KMeans 方法进行聚类,代码如下:
```python
from sklearn.cluster import KMeans
# 聚类数
K = 16
# 进行聚类
kmeans = KMeans(n_clusters=K, random_state=0).fit(data)
# 获取聚类结果
labels = kmeans.labels_
# 获取聚类中心
centers = kmeans.cluster_centers_
# 将每个像素点替换为对应簇的中心点
new_data = centers[labels]
# 将处理后的像素点重新组合成二维数组
new_im = new_data.reshape(im.shape)
# 将结果保存为图像文件
new_im = (new_im * 255).astype(np.uint8)
Image.fromarray(new_im).save('compressed.png')
```
4. 实验结果
我们分别尝试了不同的聚类数 K,结果如下所示:
| K | 压缩图像 |
|---|--------|
| 2 | ![K=2](K=2.png) |
| 4 | ![K=4](K=4.png) |
| 8 | ![K=8](K=8.png) |
| 16 | ![K=16](K=16.png) |
| 32 | ![K=32](K=32.png) |
从结果可以看出,随着聚类数 K 的增加,压缩后的图像质量越来越高。当 K 达到一定值后,压缩效果已经非常接近原始图像,但是此时压缩后的图像文件大小仍然比原始图像小很多。
# 实验总结
本实验使用 K-means 聚类算法对图像进行了压缩,并比较了不同聚类数对压缩效果的影响。实验结果表明,随着聚类数的增加,压缩效果越来越好,但是此时压缩后的图像文件大小仍然比原始图像小很多,因此在实际应用中需要权衡压缩效果和文件大小。
阅读全文