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

    文章

    182

    浏览量

    17988
  • 聚类算法
    +关注

    关注

    2

    文章

    118

    浏览量

    12124
  • K-means
    +关注

    关注

    0

    文章

    28

    浏览量

    11286

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

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

收藏 人收藏

    评论

    相关推荐

    基于距离的算法K-means的设计实现

    K-means 算法是典型的基于距离的算法,采用距离作为相似性的评价指标,两个对象的距离越近,其相似度就越大。而簇是由距离靠近的对象组成
    的头像 发表于 07-18 09:19 2242次阅读
    基于距离的<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b><b class='flag-5'>K-means</b>的设计实现

    一种增强的K-means算法在入侵检测中的应用

           异常检测是入侵检测中防范新型攻击的基本手段,本文应用增强的K-means 算法对检测数据进行分类。计算机仿
    发表于 09-03 10:21 14次下载

    Web文档k-means算法的改进

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

    K-means+算法研究综述

    介绍了K-means 算法的目标函数、算法流程,并列举了一个实例,指出了数据子集的数目K、初
    发表于 05-07 14:09 27次下载
    <b class='flag-5'>K-means</b>+<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>研究综述

    基于离散量改进k-means初始中心选择的算法

    传统kmeans算法由于初始中心的选择是随机的,因此会使结果不稳定。针对这个问题,提出一种基于离散量改进
    发表于 11-20 10:03 2次下载

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

    针对传统的K-means算法无法预先明确数目,对初始中心选取敏感且易受离群孤点影响导致
    发表于 11-25 11:35 0次下载

    K均值算法的MATLAB实现

    K-means算法是最简单的一种算法算法的目的是使各个样本与所在
    发表于 12-01 14:07 2.1w次阅读
    <b class='flag-5'>K</b>均值<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>算法</b>的MATLAB实现

    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算法受初始中心影响过大以及容易陷入局部最优的不足,提出一种基于改进
    发表于 12-13 17:24 3次下载

    大数据处理的优化抽样K-means算法

    针对大数据环境下K-means算法精度不足和收敛速度慢的问题,提出一种基于优化抽样
    发表于 12-22 15:47 4次下载
    大数据处理的优化抽样<b class='flag-5'>聚</b><b class='flag-5'>类</b><b class='flag-5'>K-means</b><b class='flag-5'>算法</b>

    K-Means算法的简单介绍

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

    如何使用K-Means算法改进的特征加权算法详细资料概述

    聚类分析是将研究对象分为相对同质的群组的统计分析技术,聚类分析的核心就是发现有用的对象簇。K-means算法由于具有出色的速度和良好的可扩展性,一直备受广大学者的关注。然而,传统的
    发表于 12-20 10:28 10次下载

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

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

    K-means算法指南

    技术领域中,K-means可能是最常见和经常使用的技术之一。K-means使用迭代细化方法,基于用户定义的集群数量(由变量K表示)和数
    的头像 发表于 10-28 14:25 1439次阅读

    大学课程 数据分析 实战之K-means算法(2)算法代码

    继续讲解! 程序来啦! 最后看一下程序示例!看看如何用K-means算法实现数据的过程。程序很简单,侧重让大家了解和掌握 K-means
    的头像 发表于 02-11 07:20 436次阅读