版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nicht_sehen/article/details/89156215
定义:
k-平均算法(英文:k-means clustering)源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类分析方法流行于数据挖掘领域。k-平均聚类的目的是:把 n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。这个问题将归结为一个把数据空间划分为Voronoi cells的问题。
---------摘自维基百科
算法步骤:
- 初始化常数K,随机选取质心
- 计算样本与每个质心之间的相似度,将样本归类到最相似的类中
- 重新计算质心
- 重复23,直到质心不变
- 输出最终的质心以及每个类
算法的数学解释:
图像分割实战:
代码:
from sklearn.cluster import KMeans
import PIL.Image as image
from PIL import ImageFilter
import numpy as np
img = image.open('C:/Users/Nicht_sehen/Desktop/123.jpg')
row,col = img.size
img = img.convert('RGB') # 转RGB 否则会出现int不可以迭代的错误
print(row,col)
data = []
for x in range(row):
for y in range(col):
r,g,b = img.getpixel((x,y))
data.append([r/256.0,g/256.0,b/256.0])
Data = np.mat(data)
label = KMeans(n_clusters=3).fit_predict(Data)
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("C:/Users/Nicht_sehen/Desktop/4.jpg", "JPEG")
效果:
总结:
Kmeans是一种聚类算法,用在图像分割里可以很好的对不同颜色进行聚类,但是对于某物体上有不同颜色的图片来说分割效果就不是很好(我的目的是把物体整个切下),如下图: