Advertisement

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() 处源码。(欧几里得距离)

该方法用于计算余弦距离。

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")

全部评论 (0)

还没有任何评论哟~