• 基于聚类的“图像分割”(python)


    基于聚类的“图像分割”

    参考网站: https://zhuanlan.zhihu.com/p/27365576
    昨天萌新使用的是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成这样会不会被骂

    然而自己想太多

  • 相关阅读:
    并发编程 进程
    计算机的发展史和操作系统简介
    subprocess和struct模块
    socket编程
    面向对象进阶 反射
    类的内置方法
    常用模块(hashlib,configparser,logging)

    面向对象封装 classmethod和staticmethod方法
    面向对象 继承补充和多态
  • 原文地址:https://www.cnblogs.com/byteHuang/p/7011654.html
Copyright © 2020-2023  润新知