机器学习:基于聚类K-Means算法实现图像的分割研究_基于kmeans聚类的图像分割_低血糖的长颈鹿的博客-程序员秘密

技术标签: 聚类  算法  python  kmeans  

目录

摘要

序言

图像分割实验:

1、实验步骤

 2、程序代码

3、实验数据

4、实验总结及分析

总结


摘要

在一幅图像中,景物往往有众多的目标组成,反映在图像中是众多的区域。图像分割属于图像处理中一种重要的图像分析技术。图像分割的传统方法是对灰度图像分割,处理图像的亮度分量,简单快速。但却忽略了图像中很大一部分信息:色彩,因此分割效果不佳。对彩色图像分割的研究一直是图像处理的焦点,它采用各种颜色空间模型,使得图像分割更全面,更精确。

本文章首先介绍了传统的图像分割与聚类算法分割,然后重点介绍一种基于K-均值聚类算法的图像改进分割方法。实验结果表明,改进的分割方法能够实时稳定的对目标分割提取,分割效果良好。

关键词:K-Means聚类,机器学习,python,聚类算法

序言

在计算机视觉和图像分析中。如何把目标物体从图像中有效分割出来一直是一个经典难题之一,它决定图像的最终分析质量和模式识别的判别结果。图像分割是指将图像中具有特殊意义的不同区域分开来,并使这些区域相互不相交,且每个区域应满足特定区域的一致性条件。图像一旦被分割,就可作进-步的处理,如基于内容的图像检索、分类及识别等。因此,图像分割是图像处理和模式识别中的一个重要研究领域。目前图像分割的算法主要有阈值分割法、边缘提取法、区域分割法、分水岭分割法等,这些分割算法各有优缺点。近年来,许多研究人员提出用聚类算法来分割图像,并取得了较好的实验结果。但如何初始划分(分类)样本以及选择代表点将直接影响分割的效果。在以往的研究中,基于K均值聚类及其改进算法的图像分割技术受到了广泛关注。

图像分割综述

21世纪是信息化的时代,信息的形式不再是单纯的语音,而是发展到包括数据、文字、图像、视频等在内的多媒体形式。据统计,人类接受外界的信息中有80%来自图像。图像分割技术是针对性很强的技术,它在人类生产和生活的方方面面起到了越来越重要的作用。

图像分割技术的现状和发展情况

图像分割算法的研究已有几十年的历史,一直以来都受到人们的高度重视。关于图像分割的原理和方法国内外已有不少的论文发表,但一直以来没有一种分割方法适用于所有图像分割处理。传统的图像分割方法存在着不足,不能满足人们的要求,为进一步的图像分析和理解带来了困难。

图像分割主要研究方法

图像分割是图像处理中的一项关键技术,图像分割是把图像分割成若干个特定的、具有独特性质的区域并提取出感兴趣目标的技术和过程,这些特性可以是像素的灰度、颜色、纹理等提取的目标可以是对应的单个区域,也可以是对应的多个区域。图像分割方法有许多种分类方式,在这里将分割方法概括为四类:边缘检测方法、区域生长方法、阈值分割方法及结合特定理论工具的分割方法。

聚类概念

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他“簇”中的对象相异。聚类分析又称“群分析”,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析计算方法主要有如下几种:划分方法,层次方法,基于密度的方法,基于网格的方法,基于模型的方法。

K-均值聚类算法是著名的划分聚类分割方法。划分方法的基本思想是:给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类。而且这K个分组满足下列条件: (1)每一个分组至少包含-一个数据纪录; (2) 每一个数据纪录属于且仅属于一个分组;对于给定的K,算法首先给出一个初始的分组方法,以后通过反复迭代的方法改变分组,使得每一次改进之 后的分组方案都较前-次好,而所谓好的标准就是:同一分组中的记录越近越好,而不同分组中的纪录越远越好。

K-均值聚类算法

k-Means算法是machine learning领域

聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。

K-均值聚类算法描述

  • 随机选取聚类中心。
  • 根据当前聚类中心,利用选定的度量方式,分类所有样本点。
  • 计算当前每一类的样本点的均值,作为下一次迭代的聚类中心。
  • 计算下一次迭代的聚类中心与当前聚类中心的差距,如若差距小于迭代阈值时,迭代结束。

K-均值聚类算法描述图(如下图所示)

K-均值聚类算法代码轮廓:

    输入:样本集D={ x1,x2,…,xn};

          聚类簇数k

    过程:从样本集D中随机选择k个样本作为初始均值向量{ u1,u2,…,uk}

    Repeat

   Ci = Ø(1≤i≤k)

    for j = 1,2,,m  do

       计算样本xj与各均值向量ui的距离:dji =||xj-ui||2;

       根据距离最近的均值向量确定xj的簇标记:λj = argminie{1,2,…,k}dji

       将样本xj划入相应的簇:Cλj = Cλj ∪ { xj}

    end for

   for i = 1,2,...,k

    计算新的均值向量:ui' = 1||Ci||

       if ui' ≠ ui then

              将当前均值向量ui更新为ui'

       else

       保持当前均值向量不变

   end if

end for

until 当前均值向量均未更新

输出:“簇”划分C = { C1,C2,…,Ck}

其中,D为样本集,聚类所得“簇”划分为C

K-均值聚类算法代码轮廓图:(如下图所示)

K-均值聚类法在图像分割中得到广泛应用。在K-均值算法中,常规的优化算法主要针对聚类数和聚类中心的选取,即通过一些检测聚类有效性的函数计算最佳聚类数k,并在此基础上优化分割效果。近年的一些研究[10][11]表明,融合多种图像特征更有利于获得较好的分割效果,研究表明,在对自然彩色图像进行分割时,考虑了像素的空间特征,算法有更好的鲁棒性。

图像特征提取

颜色特征的提取

颜色特征是在图像分割中应用最为广泛的视觉特征,在一些算法中,一个高复杂度特征的提取可能能够解决问题(进行目标检测等目的),但这将以处理更多数据,需要更高的处理效果为代价。而颜色特征无需进行大量计算。只需将数字图像中的像素值进行相应转换,表现为数值即可。因此颜色特征以其低复杂度成为了一个较好的特征。

纹理特征的提取

纹理通常指在图像中反复出现的局部模式和它们的排列规则,具有不依赖于颜色或照度并可以反映图像中同质现象的特点,

图像分割实验

利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。本次实验我们将apple聚类中心设置n_clusters=3,cat聚类中心设置为2。

1、实验步骤

  • 建立kms.py工程并导入所需python包
  • 加载本地图片进行预处理
  • K-Means聚类算法实现
  • 聚类像素点并保存输出

 2、程序代码

import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
def loadDate(filePath):
    f=open(filePath,'rb')#以二进制打开文件
    data=[]
    img=image.open(f)#以列表形式储存图片像素值
    m,n=img.size#获得图片大小,为便利每个像素准备
    for i in range(m):
        for j in range(n):
            x,y,z=img.getpixel((i,j))
            #getpixel返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
            data.append([x/256.0,y/256.0,z/256.0])#将每个像素归一化成0-1
    f.close()
    return np.array(data),m,n#返回矩阵形式的data,以及图片的大小

imgData,row,col=loadDate("C:/Users/lenovo/Desktop/cat.jpg")
#使用loadData方法处理图片
label=KMeans(n_clusters=3).fit_predict(imgData)
#聚类获取每个像素所属类别
label=label.reshape([row,col])
#创建一张灰度图保存聚类后的结果
pic_new=image.new("L",(row,col))
#根据所属类别向图片中添加灰度值

for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j),int(256/(label[i][j]+1)))
pic_new.save("C:/Users/lenovo/Desktop/new_cat.jpg","JPEG")#保存处理后的图片

3、实验数据

测试image:

3、实验结果

结果图1

结果图2

4、实验总结及分析

在本次实验中,利用K-Means算法将图像分割出来,但从结果图来看,效果不是很理想。通过设置不同的聚类中心,从而得到不同的聚类结果。如果想要得到预想的效果,必须多次尝试,这使得K值具有不确定性,不利于操作。实验表明,基于粗糙集理论和K-均值聚类算法的图像分割方法,比随机选取聚类的中心点和个数减少了运算量,提高了 分类精度和准确性,而且对于低对比度、多层次变化背景的图像的形状特征提取具有轮廓清晰、算法运行速度快、内存占用小等特点,是一种有效的灰度图像分割算法。

K-Means聚类算法的主要优点:

(1)原理比较简单,实现也是很容易,收敛速度快。

(2)聚类效果较优。

(3)算法的可解释度比较强。

(4)主要需要调参的参数仅仅是簇数k。

K-Means聚类算法的主要缺点:

(1)K值的选取不好把握

(2)采用迭代方法,得到的结果只是局部最优

(3)对噪音和异常点敏感

(4)初始聚类中心的选择

(5)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

(6)对于不是凸的数据集比较难收敛

总结

将K-均值理论应用在图像分割中,发现K-均值理论在图像分割中具有很高的应用价值。本项目仅用于技术交流和学习,欢迎提出改进意见,以期共同进步。本人也是新手,还望各位大佬可以提出建议,感谢!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52974528/article/details/124797709

智能推荐

样式@media all{ }表示的意思_ggyy899的博客-程序员秘密

@media指定样式表规则用于指定的设备类型。如:@media screen {BODY {font-size:12pt; }}表示设置显示器用字体尺寸@media print {@import "print.css"BODY {font-size:8pt;}}表示设置打印机用字体尺寸@media all{  }就表示all所有媒体类型的样式

一张图片在背景图中居中显示_huanxianxianshi的博客-程序员秘密

1.知识点:(1)图片水平居中显示https://zhidao.baidu.com/question/537179073.html看这个的回答   我用的是第二种方法(2)有关于background属性的知识点:http://css.doyoe.com/(这个是css参考手册 打开页面后按Ctrl+F 然后在搜索框搜索background按Enter键即可查找)2.实现< !DO...

python dlib opencv人脸识别准确度_使用dlib,OpenCV和Python进行人脸识别—人眼瞌睡识别..._weixin_39790738的博客-程序员秘密

使用dlib,OpenCV和Python进行人脸识别—人眼瞌睡识别前期文章我们分享了如何使用python与dlib来进行人脸识别,以及来进行人脸部分的识别,如下图,dlib人脸数据把人脸分成了68个数据点,从图片可以看出,人脸识别主要是识别:人眉,人眼,人鼻,人嘴以及人脸下颚边框,每个人脸的部位都有不同的数据标签从1-68当我们识别出人脸的这68个点,可以通过访问不同的数据点来检测到人脸的部分数据...

C 众数 SDUT_碧羽o(* ̄▽ ̄*)ブ回雪的博客-程序员秘密

Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。给定一组数,你能求出众数吗?Input输入数据有多组(数据组数不超过 50),到 EOF 结束。对于每组数据:第 1 行输入一个整数 n (1 <= ...

2020年哈尔滨工业大学C语言程序设计精髓 第八周编程作业题_程序运行示例1:请输入h,m,n:10,3,1您当前输入的数据不正确!程序运行示例2:请输_YC_sweart的博客-程序员秘密

/新的一周新气象,这个星期将和大家一起进入指针了,多多指教哦!/1摘苹果(4分)题目内容:陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度(已知在100cm到200cm之间,包括100cm和200cm),以及陶陶把手伸直时能达到的最大...

python中字典与列表的引用_zheng_zetao的博客-程序员秘密

python 中的list和dict是当其作为参数进行传递的时候,是引用传递。 何谓引用传递? 就是函数内部对list和dict参数的修改和删除操作会影响到实参。例如:def change_list(_list): _list.append('a')def change_dict(dic): dic['name'] = 'root'if __name__ == '__main__':...

随便推点

使用canal 1.0.25,启动canal服务端时或更新数据库数据时,canal服务端报错_J_bean的博客-程序员秘密

1 问题使用canal 1.0.25,启动canal服务端时或更新数据库数据时,canal服务端报错。报错如下:com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'XX') …2 分析引起这个问题的原因是创建表的SQL语句中有“)”。根本原因是canal依赖的druid版本的问题。3 解决措施目前的解决办法如...

三国人物大全_普通网友的博客-程序员秘密

三国人物大全魏姓名 字 生卒 祖籍 官至 爵位曹操 孟德 155~220 沛国谯县 丞相 魏王 追魏太祖武皇帝曹丕 子桓 187~226 沛国谯县 魏文帝 曹睿 元仲 205~239 沛国谯县 魏明帝 曹芳 兰卿 232~274 沛国谯县 齐王 曹髦 彦士 241~260 沛国谯县 高贵乡公 曹奂 景明 246~302 沛国谯县 魏元帝 曹仁 子孝 168~223 沛国谯县 大司马 假节 陈侯曹...

大家新年好!_新年好的汇编频率_iamsongyu的博客-程序员秘密

最近一段时间没有更新,但是东西已经码好了,最近干了这么几件事1.1月底的时候去Xman冬令营的移动安全学习了十天,以前本科的时候学习过选修课Andorid程序设计,不过那时候很浅的,结课也是做一个简单的界面,加点点击事件和界面切换就完成了,这次学了更多的关于安卓的原理和分析。2.2月初的时候过年前,在家里陪小弟学习,写作业,明白了看孩子真是一个不轻松的活啊,自己什么也不能干,电视也不能打开...

BZOJ2588: Spoj 10628. Count on a tree_CR1SceNT的博客-程序员秘密

题目链接在树上建主席树+LCA,主席树中每一棵线段树维护的是当前点到根这一段区间。 我用的树链剖分求LCA,也可以用倍增。 (查询里带了七个参感觉很蠢。。)【代码】#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <algorithm>#include <cstring>#inc

《图处理加速架构研究》第二章【阅读笔记及思考】_智慧的旋风的博客-程序员秘密

第 2 章 图处理应用加速架构的研究背景与现状主要内容是:图计算典型算法+编程模型图神经网络模型(图计算加速架构+图神经网络加速架构)研究现状2.1 图与其广泛的应用泛泛而谈。2.2 图的特征与存储格式2.2.1 图的特征无结构特性:形状不规则,邻居数量不确定极度稀疏:A是稀疏矩阵幂律度分布:存在极少量度很高的节点,大量节点的度都很低——“名人效应”强群体结构:群体或社区结构2.2.2 图的存储格式...

python列表写入字典_python小练习-列表、字典_weixin_39791349的博客-程序员秘密

1、 切片(Slice)L=['a','b','c','d']L[0:2]表示从索引0开始取,直到索引2为止,但不包括索引2。即索引0,1,正好是2个元素如果第一个索引是0,还可以省略:L[:2]L[-1]取倒数第一个元素L[:]表示从第一个到最后一个,即原样复制一个listL[::2]去全部数据,但是每两个取一个字符串逆序:str = “abcdefg”str1 = str[::-1] # ...