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

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

  • K-Means算法
    • 该项目的需求分析
    • 导入所需的包
    • 利用Python自带的PIL库加载图片
    • 调用函数,读取本地图片
    • 创建一个新图像,用来保存分割后的结果
    • 运行结果

K-Means算法

K-Means聚类算法是无监督学习算法,是将没有类别标签的数据集,把特征属性相同的数据样本集合在一起,形成一个聚类,其中K的取值就是聚类的个数,Means就是数据集的每一个中心点,也就是我们所说的质心。

该项目的需求分析

  1. 首先,我们的聚类对象是图片每个像素点的rgb值,分为两类,一类是黑点,一类白点。
  2. 就是读取照片文件,利用PIL库,获取图片的width、height和每一个像素点的rgb值,用二维数组表示。
  3. 利用聚类方法将其分开,将聚类结果转换为像素值,保存新的图片即可。

导入所需的包

注意:如果代码运行有编码问题,可以在首部添加#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')

运行结果

在这里插入图片描述

你可能感兴趣的:(python语言,数据分析,python,机器学习,聚类)