您的位置:首页 > 其它

K-means、图像分割

2017-08-31 14:21 916 查看
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

a326

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: