基于聚类的“图像分割”案例——K-means聚类算法

图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。

1. 应用

1.1. 在机车检验领域,可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全。
1.2. 在生物医学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助。

2. 图像分割常用方法

2.1. 阈值分割 :对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。
2.2. 边缘分割 :对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片区域的边缘。
2.3. 直方图法 :对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到分割的目的。
2.4. 特定理论 :基于聚类分析、小波变换等理论完成图像分割。

3. 实例描述

3.1. 目标 :利用 K-means聚类算法 对图像像素点颜色进行聚类。
3.2. 输出 :同一聚类中的点使用相同颜色标记,不同聚类颜色不同。
3.3. 导入Python模块 :from sklearn.cluster import KMeans
3.4. 实例数据 :本实例中的数据可以是任意大小的图片,为了使效果更佳直观,可以采用区分度比较明显的图片。

4. 实验过程

4.1. 实现步骤

  • [ Step1 ] 建立工程并导入sklearn包
  • [ Step2 ] 加载图片并进行预处理
  • [ Step3 ] 加载 K-means聚类算法
  • [ Step4 ] 对像素点进行聚类并输出

PIL包: 因为本实验涉及图像的加载和创建,因此需要使用到 PIL 包。

Step1: 建立工程并导入sklearn包

  • 创建Kmeans.py文件
  • 导入sklearn相关包
import numpy as np
from PIL import Image  #加载PIL包,用于加载创建图片
from sklearn.cluster import KMeans  #加载Kmeans算法
import matplotlib.pyplot as plt  #绘制图像

Step2: 加载图片并进行预处理

  • 加载训练数据
def loadData(filePath):
    f = open(filePath, 'rb') #以二进制形式打开文件
    data = []
    img = Image.open(f)  #以列表的形式返回图片像素值
    m, n = img.size   #获取图片的大小
    for i in range(m):  #将每个像素点的RGB颜色处理到0-1
        for j in range(n):
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0, y/256.0, z/256.0]) #范围内并存入data
    f.close()
    return np.mat(data), m, n #以矩阵的形式返回data,以及图片大小

Step3: 加载 K-means聚类算法

  • 选取聚类中心个数
#加载Kmeans聚类算法
km = KMeans(n_clusters= 3) #其中n clusters属性指定了聚类中心的个数为3

Step4: 对像素点进行聚类并输出

  • 对像素点进行聚类并输出心依据聚类中心,对属于同一聚类的点使用同样的颜色进行标记。
#聚类获取每个像素所属的类别
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#创建一张新的灰度图保存聚类后的结果
pic_new = Image.new('L', (row, col))

#根据所属类别向图片中添加灰度值
# 最终利用聚类中心点的RGB值替换原图中每一个像素点的值,便得到了最终的分割后的图片
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))

#以JPEG格式保存图片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()

5. 用例数据及展示结果

5.1. 图片素材:
图片链接: link

5.2. 聚类的“图像分割”结果对比展示:

原始图像

加载 K-means聚类算法 后,对像素点进行聚类输出结果:

在这里插入图片描述

6. K-means聚类算法-程序代码

# -*- coding: utf-8 -*-
# @Time    : 2020/3/31 21:27
# @Author  : Zudy
# @FileName: course1.py

'''
1.进行图像中颜色的分类(K-means聚类算法对图像像素点颜色进行聚类实现间的图像分割)
'''

import numpy as np
from PIL import Image
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

def loadData(filePath):
    f = open(filePath, 'rb') #以二进制形式打开文件
    data = []
    img = Image.open(f)  #以列表的形式返回图片像素值
    m, n = img.size   #获取图片的大小
    for i in range(m):  #将每个像素点的RGB颜色处理到0-1
        for j in range(n):
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0, y/256.0, z/256.0]) #范围内并存入data
    f.close()
    return np.mat(data), m, n #以矩阵的形式返回data,以及图片大小

path = 'D:/Python/Python_learning/Python_Machine_learning/基于聚类的整图分割/demo1.jpg'
imgData, row, col = loadData(filePath= path)
print(imgData)
print(row)
print(col)

#加载Kmeans聚类算法
km = KMeans(n_clusters= 3)

#聚类获取每个像素所属的类别
label = km.fit_predict(imgData)
label = label.reshape([row, col])
#创建一张新的灰度图保存聚类后的结果
pic_new = Image.new('L', (row, col))

#根据所属类别向图片中添加灰度值
# 最终利用聚类中心点的RGB值替换原图中每一个像素点的值,便得到了最终的分割后的图片
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))

#以JPEG格式保存图片
pic_new.save("result_demo1.jpg","JPEG")
plt.imshow(pic_new)
plt.show()

实验分析
通过设置不同的k值,能够得到不同的聚类结果。同时,k值的不确定也是Kmeans算法的- -个缺点。往往为了达到好的实验结果,需要进行多次尝试才能够选取最优的k值。

  • 17
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,我知道了。关于你的问题,K-Means算法和Mini Batch K-Means算法都是聚类算法,它们都可以用于对数据集进行聚类。但是它们之间也存在一些区别。 K-Means算法的步骤如下: 1. 从数据集中随机选择k个点作为簇的中心点; 2. 对于每个数据点,计算它与每个簇中心点的距离,将它归为距离最近的簇; 3. 根据归类结果重新计算每个簇的中心点; 4. 重复2和3步,直到簇的中心点不再改变或达到最大迭代次数。 而Mini Batch K-Means算法K-Means算法的一种优化,它的主要改进在于每次只从数据集中随机选择一部分数据作为样本,而不是全部数据,来计算簇的中心点,从而减少计算量。具体步骤如下: 1. 从数据集中随机选择k个点作为簇的中心点; 2. 从数据集中随机选择一个小的批次(batch)数据; 3. 对于每个数据点,计算它与每个簇中心点的距离,将它归为距离最近的簇; 4. 根据归类结果重新计算每个簇的中心点,并将此批次数据用于更新中心点; 5. 重复2~4步,直到簇的中心点不再改变或达到最大迭代次数。 相比于K-Means算法,Mini Batch K-Means算法具有以下优点: 1. 计算速度更快,因为每次只需要计算一部分数据; 2. 可以处理大规模数据集,因为不需要将全部数据集加载到内存中; 3. 可以保持较好的聚类效果。 但是,Mini Batch K-Means算法也存在一些缺点,例如聚类效果可能不如K-Means算法稳定,因为每次只随机选择一部分数据进行计算,可能会导致某些数据点没有被考虑到。同时,Mini Batch K-Means算法需要调整一些超参数,例如批次大小和最大迭代次数等,以达到最佳效果。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值