1. 程式人生 > 其它 >使用 K-means 聚類演算法處理影象(Python)

使用 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()

結果: