k-means 圖像分割


經典的無監督聚類算法,不多說,上代碼。

 1 import numpy as np
 2 import pandas as pd
 3 import copy
 4 import matplotlib.pyplot as plt
 5 
 6 pic = plt.imread('cs-nonoise.jpg')
 7 # plt.imshow(pic)
 8 # pic.shape   #(1200, 800)
 9 data = pic.reshape(-1, 3)
10 
11 
12 def kmeans_wave(n, k, data):  # n為迭代次數, k為聚類數目, data為輸入數據
13     data_new = copy.deepcopy(data)
14     data_new = np.column_stack((data_new, np.ones(1200*800)))   # 擴展一個維度用來存放標簽
15     center_point = np.random.choice(1200*800, k, replace=False)     # 隨機選擇初始點
16     center = data_new[center_point,:]
17     distance = [[] for i in range(k)]   # 距離度量
18     for i in range(n):
19          for j in range(k):
20              distance[j] = np.sqrt(np.sum(np.square(data_new - np.array(center[j])), axis=1))     # 更新距離
21          data_new[:,3] = np.argmin(np.array(distance), axis=0)   # 將最小距離的類別標簽作為當前數據的類別
22          for l in range(k):
23              center[l] = np.mean(data_new[data_new[:,3]==l], axis=0)   # 更新聚類中心
24 
25     return data_new
26 
27 
28 if __name__ == '__main__':
29     data_new = kmeans_wave(100,5,data)
30     print(data_new.shape)
31     # data_new = np.delete(data_new, 3, axis=1)
32     # print(data_new.shape)
33     pic_new = data_new[:,3].reshape(1200,800)   # 將多個標簽展示出來
34     plt.imshow(pic_new)
35     plt.show()

結果:

        

                          原圖                                                                                                                            k=5 結果圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM