天天看點

K-means、圖像分割

K-means聚類算法原理

 k-means算法以k為參數,吧n個對象分成k個簇,使簇内具有較高的相似度,而簇間的相似度較低。

  • 随機選k個點作為初始的聚類中心。
  • 對剩下的點,根據距離,将其歸入最近的簇。
  • 對每個簇,計算所有點的均值作為新的聚類中心。
  • 重複前兩步,直到中心不再改變。

參數: class sklearn.cluster.KMeans( n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')

init:聚類中心的初始化方法; max_inter:最大疊代次數; 一般給出n_cluster即可。

擴充:K-means預設用歐氏距離,還有餘弦相似度 、馬氏距離等 使用自定義距離方法:更改def euclidean_distance() 處源碼。(歐幾裡得距離) 使用scipy.spatial.distance.cdist方法:scipy.spatial.distance.cdist(A,B,metric='cosine')#餘弦距離。

K-means執行個體:圖像分割

圖像分割常用方法:

  • 門檻值分割
  • 邊緣分割
  • 直方圖法
  • 特定理論:小波變換、聚類分析等。

目标:利用K-means 算法對圖像像素顔色進行聚類實作簡單的圖像分割。 輸出:同一聚類中的點使用相同顔色标記,不同聚類顔色不同。

import numpy as np import PIL.Image as image from sklearn.cluster import KMeans

def loadData(filePath):     f = open(filePath,'rb')     data = []     img = image.open(f)     r,c = img.size     for i in range(m):         for j in range(n):             x,y,z = img.getpixel((i,j))             data.append([x/256.0,y/256.0,z/256.0])     f.close()     return np.mat(data),r,c

imgData,row,col = loadData('jiafeimao.jpg') #相對路徑 label = KMeans(n_clusters=5).fit_predict(imgData)

label = label.reshape([row,col]) pic_new = image.new("L", (row, col)) for i in range(row):     for j in range(col):         pic_new.putpixel((i,j), int(256/(label[i][j]+1))) pic_new.save("new-jiafeimao.jpg", "JPEG")

K-means、圖像分割
K-means、圖像分割

繼續閱讀