Advertisement

K-Means聚类算法实现图像分割

阅读量:

用K-Means聚类算法图像分割

K均值聚类算法

  • 本项目的任务分析*
  • 为项目导入必要的库*
  • 通过Python自带的PIL库加载图像文件*
  • 调用相关函数读取本地图片文件*
  • 创建一个新的图像区域用于显示分割结果*
  • 处理后的结果展示*

K-Means算法

K-Means聚类算法属于无监督学习范畴,在未标注类别数据集中根据其共同的特征属性将数据样本进行归类组合;其中参数K代表聚类的数量;而均值点则是指每组数据所对应的中心或核心位置点称为均值点

该项目的需求分析

首先, 我们处理的对象是图像中每个像素点的RGB值, 并分为两类: 黑色像素和白色像素.
即通过读取照片文件, 并利用Python Imaging Library (PIL) 库获取图像宽度, 高度以及每个像素对应的RGB值, 并将其存储为二维数组.
通过聚类方法将图像分割成两个类别, 并将聚类后的结果重新映射回对应的RGB值. 即可生成新的图像文件.

导入所需的包

注意:如果代码运行有编码问题,可以在首部添加#coding=utf-8

复制代码
    #coding=utf-8
    import PIL.Image as image
    import numpy as np
    from sklearn import preprocessing
    from sklearn.cluster import KMeans
    
    
      
      
      
      
      
    
    代码解读

利用Python自带的PIL库加载图片

复制代码
    #加载图片
    def load_img(img_path):
    #读取照片
    f = open(img_path,'rb')
    img_data = []
    #得到图片的像素点
    img_pixel = image.open(f)
    #获取尺寸
    width,height = img_pixel.size
    
    #获取图片的像素rgb值
    for w in range(width):
        for h in range(height):
            r,g,b = img_pixel.getpixel((w,h))
            img_data.append([r,g,b])
    
    #将rgb值归一化处理
    mm = preprocessing.MinMaxScaler()
    img_data_mm = mm.fit_transform(img_data)
    
    #将img_data转变成数组(矩阵)
    return np.mat(img_data_mm),width,height
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

调用函数,读取本地图片

j

该图片可以直接保存到项目文件夹中

复制代码
    #读取该目录下的weixin.jpg
    img_mat,width,height = load_img('图片.jpg')
    
    #创建聚类对象
    kmeans = KMeans(n_clusters=2)
    #拟合模型
    kmeans.fit(img_mat)
    #聚类结果
    pre_img = kmeans.predict(img_mat)
    
    #将每一个像素点的聚类结果转换为宽为width、高为height的矩阵(数组)
    img_np = pre_img.reshape([width,height])
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

创建一个新图像,用来保存分割后的结果

复制代码
    #创建一个新图片
    new_img = image.new('L',(width,height))
    
    #开始对聚类类别处理,0的像素值为255,1为127
    for i in range(width):
    for j in range(height):
        new_img.putpixel((i,j),int(256/(img_np[i][j]+1))-1)
    
    #保存新图片
    new_img.save('weixin_dark.jpg','JPEG')
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解读

运行结果

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~