基于聚类的“图像分割”

基于聚类的“图像分割”

昨天萌新使用的是PIL这个库,今天发现机器学习也可以这样玩。

视频地址Python机器学习应用

图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若 干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域 提取出来用于不同的研究。

实现步骤:

1.建立工程并导入sklearn包

2.加载图片并进行预处理

3.加载Kmeans聚类算法

4.对像素点进行聚类并输出


实验代码

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

def load_data(file_path):
    f = open(file_path,'rb') #二进制打开
    data = []
    img = image.open(f) #以列表形式返回图片像素值
    m,n = img.size #活的图片大小
    for i in range(m):
        for j in range(n):  #将每个像素点RGB颜色处理到0-1范围内并存放data
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0,y/256.0,z/256.0])
    f.close()
    return np.mat(data),m,n #以矩阵型式返回data,图片大小

img_data,row,col = load_data('1.jpg')
label = KMeans(n_clusters=3).fit_predict(img_data)  #聚类中心的个数为3
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('111.jpg')

实验结果


修改n_clusters的值会有不同结果


实验分析

通过设置不同的k值,能够得到不同的聚类结果。同时,k值的不确定也 是Kmeans算法的一个缺点。往往为了达到好的实验结果,需要进行多次尝 试才能够选取最优的k值。而像层次聚类的算法,就无需指定k值,只要给 定限制条件,就能自动地得到类别数k。


话说把女朋友P成这样会不会被骂

然而自己想太多

原图链接身为日系萌萝莉是怎么样的体验? - 知乎

发布于 2017-06-12

文章被以下专栏收录