目录
在一幅图像中,景物往往有众多的目标组成,反映在图像中是众多的区域。图像分割属于图像处理中一种重要的图像分析技术。图像分割的传统方法是对灰度图像分割,处理图像的亮度分量,简单快速。但却忽略了图像中很大一部分信息:色彩,因此分割效果不佳。对彩色图像分割的研究一直是图像处理的焦点,它采用各种颜色空间模型,使得图像分割更全面,更精确。
本文章首先介绍了传统的图像分割与聚类算法分割,然后重点介绍一种基于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。
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")#保存处理后的图片
测试image:
3、实验结果
结果图1
结果图2
在本次实验中,利用K-Means算法将图像分割出来,但从结果图来看,效果不是很理想。通过设置不同的聚类中心,从而得到不同的聚类结果。如果想要得到预想的效果,必须多次尝试,这使得K值具有不确定性,不利于操作。实验表明,基于粗糙集理论和K-均值聚类算法的图像分割方法,比随机选取聚类的中心点和个数减少了运算量,提高了 分类精度和准确性,而且对于低对比度、多层次变化背景的图像的形状特征提取具有轮廓清晰、算法运行速度快、内存占用小等特点,是一种有效的灰度图像分割算法。
K-Means聚类算法的主要优点:
(1)原理比较简单,实现也是很容易,收敛速度快。
(2)聚类效果较优。
(3)算法的可解释度比较强。
(4)主要需要调参的参数仅仅是簇数k。
K-Means聚类算法的主要缺点:
(1)K值的选取不好把握
(2)采用迭代方法,得到的结果只是局部最优
(3)对噪音和异常点敏感
(4)初始聚类中心的选择
(5)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
(6)对于不是凸的数据集比较难收敛
将K-均值理论应用在图像分割中,发现K-均值理论在图像分割中具有很高的应用价值。本项目仅用于技术交流和学习,欢迎提出改进意见,以期共同进步。本人也是新手,还望各位大佬可以提出建议,感谢!
这是一个脑回路清奇但是真实有效的解决方案使用的是SQL Server 2017,安装SSMS打不开这个问题网上给出的解决方案大概是卸了VS2017,装完之后再装回来 卸了Microsoft Visual C++ 2017 Redistributable,修复Microsoft Visual Studio 2015 Shell (Isolated),再把卸掉的装回来可是卸载实在舍不...
会签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,需全部同意之后,审批才可到下一审批节点;或签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,只要其中任意一人审批即可到下一审批节点。如果一个活动是多实例,将通过在该活动底部的三条短线表示。三条竖线代表实例会并行执行,而三条横线代表顺序执行。用户任务配置多实例类型、集合、完成条件、元素变量、分配用户完成条件通过这几个内置变量来决定nrOfInstances 一共有多少个实例 nrOf.
刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们不知到一个函数或者一个模块到底在哪里出了问题时我们可以利用dump_stack有效的找到问题的根源,下面只是简单的给出了使用方法。 我在自己的主机上试了一下dump_stack()Makefile文件点击(此处)折叠或打开obj-m:=hello.oKERNELBUILD:=/...
Java 反射标签: Java基础动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。(引自: 百度百科)var execString = "alert(Math.floor
*之前文章里有写到选项卡,上一个使用JS写的,这次用jquery写的,与之前大不相同的是,jquery语言简便,代码量少,易懂!测试代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="...
一、在GLSL中使用Uniform Block在GLSL渲染语言中,我们经常采用缓冲区来存储Uniform型的Block。比如我们需要绘制下面这样的效果:在这里我们绘制了一个圆,圆内部颜色和外部颜色不同,而且边缘部分,颜色是平滑过渡的。我们这样来实现这一效果:首先定义一个内径和外径。然后给这个正方形分配纹理坐标,然后通过纹理坐标离(0.5,0.5)的距离与内径和外径的关
一、网络链路聚合介绍网络的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,为用户提供不间断的网络服务,同时也可以提高网络访问速度。实现网络链路聚合方式有两种,分别是:”bond”和”team”。二、实验环境(rhel7.0版本)主机环境:rhel7.0各主机信息主机名 IP server ...
git pull origin把远程分支拉取回来到本地,同时把本地代码和远程更新到一致
最近几天在ubuntu上搭建hadoop集群时,遇到一点问题,纠结几天后找到解决的办法,记录如下 在hadoop安装包安装完成之后,设置ssh免密登录时,提示没有安装ssh客户端,然后就根据提示执行 sudo apt-get update; 然后就报无法连接cn.archive.ubuntu.com之类或者更新速度太慢,这是因为ubuntu中默
标准库函数 std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。int a;int &&r1 = a; // 编译失
--以下脚本于20180124在Tony环境实现--online模式接收DECLARE g_group_id NUMBER := rcv_interface_groups_s.nextval; g_creation_date DATE := SYSDATE; g_created_by NUMBER := fnd_global.user_id;...
参见 windows 下OpenCV的安装部署详细教程测试案例:#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp> using namespace cv;int main(int argc, char *argv[]){ Q...