zoukankan      html  css  js  c++  java
  • 基于聚类的“图像分割”(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成这样会不会被骂

    然而自己想太多

  • 相关阅读:
    布局重用 include merge ViewStub
    AS 常用插件 MD
    AS 2.0新功能 Instant Run
    AS .ignore插件 忽略文件
    AS Gradle构建工具与Android plugin插件【大全】
    如何开通www国际域名个人网站
    倒计时实现方案总结 Timer Handler
    AS 进行单元测试
    RxJava 设计理念 观察者模式 Observable lambdas MD
    retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
  • 原文地址:https://www.cnblogs.com/byteHuang/p/7011654.html
Copyright © 2011-2022 走看看