使用 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()
结果:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)