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成这样会不会被骂

    然而自己想太多

  • 相关阅读:
    使用序列化实现对象的拷贝
    理解 Java 的三大特性之多态
    LeetCode OJ:Add and Search Word
    关于Qt的事件循环以及QEventLoop的简单使用
    LeetCode OJ:Generate Parentheses(括号生成)
    LeetCode OJ:Maximal Square(最大矩形)
    LeetCode OJ:Range Sum Query 2D
    LeetCode OJ:Power of Two(2的幂)
    LeetCode OJ:Longest Increasing Subsequence(最长递增序列)
    LeetCode OJ:Ugly Number II(丑数II)
  • 原文地址:https://www.cnblogs.com/byteHuang/p/7011654.html
Copyright © 2011-2022 走看看