python手写kmeans进行图片聚类(不调用kmeans函数)
时间: 2023-07-02 17:07:16 浏览: 131
python实现kmeans聚类算法
5星 · 资源好评率100%
K-Means 是一种经典的聚类算法,它常被用于图像分割和图像聚类。下面是一个 Python 手写 K-Means 算法实现的示例代码,用于对图片进行聚类。
```python
import numpy as np
from PIL import Image
def kmeans(img, K=3, max_iter=100):
# 将图像转换为向量形式
img_vec = img.reshape((-1, 3))
# 随机初始化聚类中心
centroids = img_vec[np.random.choice(len(img_vec), K, replace=False)]
for i in range(max_iter):
# 计算每个点到聚类中心的距离
distances = np.linalg.norm(img_vec[:, np.newaxis, :] - centroids, axis=2)
# 将每个点归类到距离最近的聚类中心
labels = np.argmin(distances, axis=1)
# 更新聚类中心
for j in range(K):
centroids[j] = np.mean(img_vec[labels == j], axis=0)
# 将每个点的颜色替换为所属聚类中心的颜色
img_vec[...] = centroids[labels]
return img_vec.reshape(img.shape)
# 读取图像
img = np.array(Image.open('test.jpg'))
# 调用 kmeans 函数进行聚类
clustered_img = kmeans(img)
# 显示聚类后的图像
Image.fromarray(clustered_img).show()
```
在上面的代码中,我们首先将图像转换为向量形式,然后随机初始化 K 个聚类中心。接着,我们执行 max_iter 次迭代,每次迭代都计算每个点到聚类中心的距离,并将每个点归类到距离最近的聚类中心。最后,我们根据每个点所属的聚类中心的颜色更新该点的颜色,并将其转换回图像形式。
需要注意的是,这个简单的 K-Means 算法实现可能存在局部最优解的问题,因此在实际应用中可能需要多次运行算法,或者使用改进的 K-Means 算法。
阅读全文