使用 K-means 聚类算法处理图像(Python)

K-means算法属于无监督分类,通过按照一定的方式度量样本之间的相似度,通过迭代更新聚类中心,当聚类中心不再移动或移动差值小于阈值时,则就样本分为不同的类别。

步骤:

 

1、随机初始化K个聚类中心

 

2、计算每个样本与k个聚类中心的距离选择距离最小的聚类中心,将样本划分到这个聚类中心中;

 

3、计算划分到每个类别中所有样本特征的均值,并将该均值作为每个类别新的聚类中心;

 

4、重复2、3步操作,直至聚类中心不再改变

 

复制代码
 1 import numpy as np
 2 import copy
 3 import matplotlib.pyplot as plt
 4 
 5 pic = plt.imread('E:\TestA_Update\A32.jpg')
 6 # pic.shape   #(647, 1200)
 7 data = pic.reshape(-1, 3)  #转化成3列,行数自行计算的矩阵
 8 
 9 def kmeans_wave(n, k, data):  # n为迭代次数, k为聚类数目, data为输入数据
10     data_new = copy.deepcopy(data)   #深复制,就是从输入变量完全复刻一个相同的变量,无论怎么改变新变量,原有变量的值都不会受到影响
11     data_new = np.column_stack((data_new, np.ones(674*1200)))   # 增加一个列
12     center_point = np.random.choice(674*1200, k, replace=False)     # 随机选择初始点,位置不重复
13     center = data_new[center_point,:]   #聚类中心的rgb像素值
14     distance = [[] for i in range(k)]   # 距离聚类中心的距离集合
15     for i in range(n):
16          for j in range(k):
17              distance[j] = np.sqrt(np.sum(np.square(data_new - np.array(center[j])), axis=1))     # 更新距离
18          data_new[:,3] = np.argmin(np.array(distance), axis=0)   # 选出最小距离,将对应的j放在第四列
19          for l in range(k):
20              center[l] = np.mean(data_new[data_new[:,3]==l], axis=0)   # 求平均值,更新聚类中心
21 
22     return data_new
23 
24 if __name__ == '__main__':
25     data_new = kmeans_wave(80,6,data)
26     print(data_new.shape)
27     pic_new = data_new[:,3].reshape(674,1200)
28     plt.subplot(1,2,1)
29     plt.title('A32')
30     plt.imshow(pic)
31     plt.subplot(1,2,2)
32     plt.title('K-MEANS')
33     plt.imshow(pic_new)
34     plt.show()
复制代码

 

结果:

 

posted @   能吃八碗饭  阅读(117)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示