0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于K-means聚类算法的图像分割

新机器视觉 来源:新机器视觉 2023-09-07 16:59 次阅读

				

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

1. 应用

  • 在机车检验领域,可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全。

  • 在生物医学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助。

2. 图像分割常用方法

  • 阈值分割:对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。

  • 边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片区域的边缘。

  • 直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到分割的目的。

  • 特定理论:基于聚类分析小波变换等理论完成图像分割。

3. 实例描述

  • 目标:利用K-means聚类算法对图像像素点颜色进行聚类。

  • 输出:同一聚类中的点使用相同颜色标记,不同聚类颜色不同。

  • 导入Python模块:from sklearn.cluster import KMeans

  • 实例数据:本实例中的数据可以是任意大小的图片,为了使效果更佳直观,可以采用区分度比较明显的图片。

4. 实验过程

  • [ 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. 用例数据及展示结果

6de7ea7c-4d5b-11ee-a25d-92fbcf53809c.png

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='./基于聚类的整图分割/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值。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像分割
    +关注

    关注

    4

    文章

    173

    浏览量

    17861
  • 聚类算法
    +关注

    关注

    2

    文章

    118

    浏览量

    12077
  • K-means
    +关注

    关注

    0

    文章

    28

    浏览量

    11225

原文标题:[sklearn]基于K-means聚类算法的图像分割

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FCM算法用于医学图像分割matlab源程序

    FCM算法以及改进模糊算法用于医学图像
    发表于 05-11 23:30

    FCM算法以及改进模糊算法用于医学图像分割的matlab源程序

    FCM算法以及改进模糊算法用于医学图像
    发表于 05-11 23:54

    机器学习的图像压缩应用

    DIY图像压缩——机器学习实战之K-means 图像压缩:色彩量化
    发表于 08-19 07:07

    使用K-means压缩图像

    山东大学机器学习(实验六内容)—— K-Means
    发表于 08-28 09:25

    舆情分析的理论基础和算法

    [源码和文档分享]JAVA实现基于k-means算法实现微博舆情热点分析系统
    发表于 06-04 08:21

    调用sklearn使用的k-means模型

    【python】调用sklearn使用k-means模型
    发表于 06-12 13:33

    K-Means有什么优缺点?

    K-Means的主要优点是什么?K-Means的主要缺点是什么?
    发表于 06-10 06:14

    K均值算法的MATLAB怎么实现?

    什么是K-均值法?K均值算法的MATLAB怎
    发表于 06-10 10:01

    改进的k-means聚类算法在供电企业CRM中的应用

    针对k-means算法存在的不足,提出了一种改进算法。 针对目前供电企业CRM系统的特点提出了用聚类分析方法进行客户群细分模型设计,通过实验验证了本文提出的k-means改进
    发表于 03-01 15:28 15次下载

    Web文档聚类中k-means算法的改进

    Web文档聚类中k-means算法的改进 介绍了Web文档聚类中普遍使用的、基于分割k-means算法,分析了
    发表于 09-19 09:17 978次阅读
    Web文档聚类中<b class='flag-5'>k-means</b><b class='flag-5'>算法</b>的改进

    基于密度的K-means算法在聚类数目中应用

    针对传统的K-means算法无法预先明确聚类数目,对初始聚类中心选取敏感且易受离群孤点影响导致聚类结果稳定性和准确性欠佳的问题,提出一种改进的基于密度的K-means算法。该
    发表于 11-25 11:35 0次下载

    K-Means算法改进及优化

    传统的k-means算法采用的是随机数初始化聚类中心的方法,这种方法的主要优点是能够快速的产生初始化的聚类中心,其主要缺点是初始化的聚类中心可能会同时出现在同一个类别中,导致迭代次数过多,甚至陷入
    发表于 12-05 18:32 0次下载
    <b class='flag-5'>K-Means</b><b class='flag-5'>算法</b>改进及优化

    基于布谷鸟搜索的K-means聚类算法

    针对原始K-means聚类算法受初始聚类中心影响过大以及容易陷入局部最优的不足,提出一种基于改进布谷鸟搜索(cs)的K-means聚类算法(ACS-K-
    发表于 12-13 17:24 3次下载

    K-Means算法的简单介绍

    K-Means是十大经典数据挖掘算法之一。K-Means和KNN(K邻近)看上去都是K打头,但却是不同种类的算法。kNN是监督学习中的分类算法
    发表于 07-05 14:18 4615次阅读

    K-MEANS聚类算法概述及工作原理

    K-means 是一种聚类算法,且对于数据科学家而言,是简单且热门的无监督式机器学习(ML)算法之一。
    的头像 发表于 06-06 11:53 3097次阅读