K-Means算法及图像分割实战(sklearn)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nicht_sehen/article/details/89156215

定义:

k-平均算法(英文:k-means clustering)源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类分析方法流行于数据挖掘领域。k-平均聚类的目的是:把 n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。这个问题将归结为一个把数据空间划分为Voronoi cells的问题。
---------摘自维基百科

算法步骤:

  1. 初始化常数K,随机选取质心
  2. 计算样本与每个质心之间的相似度,将样本归类到最相似的类中
  3. 重新计算质心
  4. 重复23,直到质心不变
  5. 输出最终的质心以及每个类

算法的数学解释:

在这里插入图片描述

图像分割实战:

代码:

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是一种聚类算法,用在图像分割里可以很好的对不同颜色进行聚类,但是对于某物体上有不同颜色的图片来说分割效果就不是很好(我的目的是把物体整个切下),如下图:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Nicht_sehen/article/details/89156215