文档视界 最新最全的文档下载
当前位置:文档视界 > 基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

BI YE SHE JI

(20 届)

基于聚类的图像分割系统的设计与实现——分割算法模块

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

摘要

图像分割的算法研究已有很多年的历史,一直以来都得到了人们的高度重视。关于图像分割的原理和方法世界各国均有不少的论文发表,但一直以来没有一种一般的分割方法能够适用于所有图像分割处理。传统的图像分割方法的劣势在于不能满足人们的要求,为后续的图像分析和理解带来了困难。随着计算机技术以及计算机性能的迅猛发展,及其相关技术的发展和成熟,结合色彩处理,图像增强等技术,个人计算机上就能够实现图像分割处理。

图像处理技术有很多种,如图像分析,颜色转换,去噪等,但其中最主要的图像处理技术是图像分割技术,从图像中将某个特定区域与其它部分进行分离并提取出来的部分进行检测,变换,识别等处理操作。

图像的分割是实现图形理解的基础,也是计算机图形学中的一个基本问题,并且在其

他很多领域得到了应用。由于图像的格式和色彩形状不同,要实现通用且快速的图像分割仍然是一个难题。图像分割的主要研究内容有:建立可靠有效的分割模型,减少分割算法的运算量,降低分割算法的复杂度,提高分割算法的通用性及抗噪性等。但是因为分割模型的不同,各种分割方法在不同的分割模型表现出不同的优缺点。有阈值分割方法,边界分割方法,区域提取方法,结合特定理论工具的分割方法等。本文只对这些方法做简单的介绍。

本文中着重介绍的是,基于聚类的分割算法,聚类分析是一种无监督分类法,它通过归类相似性质(结构色彩)的样本实现分类。在缺少相关知识时,图像分割可以通过聚类分析完成。基于聚类分析的图像分割算法的通用性好,并且对样本空间的约束小。无论是灰度图像、彩色图像分还是纹理图像,都可以应用聚类分析方法完成分割。但是基于聚类分析的分割方法也有缺点,主要就是因为聚类分析分割算法计算量大,有可能出现极值问

题并且对噪声样本比较敏感。本文分析了当今图像分割的研究成果以及面临的主要问题,针对聚类算法用于图像分割的特点,着重对聚类算法进行了算法实现,并能用图片的形式呈现出来。

通过对聚类算法的是实现,本文在其基础上还对分割后的图片进行重新合并的操作,合并操作通过比对,计算图片碎片的相似度进行实现。

关键词:图像分割,复杂度,样本空间,聚类分割,合并,相似度

ABSTRACT

Image segmentation algorithm has several decades of history, has been subject to people's attention. On the principles and methods of image segmentation and abroad have been many papers published, but has been without a segmentation method applied to image segmentation processing. The traditional image segmentation method there is a lack of, can not meet the requirements of the people, which makes it difficult for further image analysis and understanding. With the rapid development of computer technology, and related technology development and maturation, combined with technologies such as image enhancement, image segmentation can be implemented on a computer.

The image processing technology there are many, such as image analysis, color conversion, denoising, etc., but the most important image processing techniques is image segmentation techniques from a particular region of the image will be carried out with the remaining portion was separated and extracted portion detection, transform, identification, and processing operation.

Image segmentation is the basis of visual understanding, a basic problem in computer vision, and has been applied in many fields. Due to the structure and content of the image type, to achieve rapid generic segmentation remains a challenge. The main contents of the image segmentation: establish an effective segmentation model, reducing the complexity of the segmentation algorithm, and segmentation algorithm to improve the noise immunity and versatility. Due to the split of the different models, a variety of segmentation methods have different advantages and disadvantages. Thresholding method, boundary segmentation methods, region extraction method, combined with specific theoretical tools segmentation method. This article presents a brief introduction of these methods.

Highlighted in this article, cluster analysis is an unsupervised classification, classification by classified samples of similar nature. In the absence of prior knowledge, image segmentation can be done by cluster analysis. Image segmentation method based on cluster analysis of the sample space constraints common good segmentation algorithm. However, cluster analysis-based segmentation method is not perfect, mainly due to cluster analysis of a large amount of the extreme value problems and sensitive to noise samples. This paper analyzes the the image segmentation current research and the main problems facing the clustering algorithm for image segmentation features, focus on clustering algorithm for image segmentation study.

By clustering algorithm is realized, based on the divided picture to re-merge operation, merge operation by comparison, the calculation of the similarity of the pieces on to achieve. Keywords: image segmentation, the complexity of the sample space, clustering split, merge, similarity

目录

1. 绪论 (1)

1.1 开发环境概述 (1)

1.1.1 Visual Studio 2008简介 (1)

1.2 开发语言概述 (2)

1.2.1 C++简介 (2)

1.2.2 C++优点 (2)

1.2.3 C++缺点 (3)

2.图像分割简介 (3)

2.1图像分割概述 (3)

2.1.1图像分割的意义 (4)

2.1.2图像分割的现状及未来 (4)

2.2图像分割技术 (4)

2.2.1图像分割方法及其特点 (5)

3. 图像分割系统 (6)

3.1图像获取 (8)

3.2图像保存 (9)

3.3图像预处理 (9)

3.3.1 Lab色彩模型 (9)

3.3.2 RGB色彩模型 (10)

3.4聚类图像分割 (10)

3.4.1首次确定聚类中心 (10)

3.4.2聚类计算 (12)

3.4.3重新计算聚类中心 (14)

3.4.4聚类分割后的优化 (16)

3.4.5画边界线完成分割 (17)

3.4.6分割结果展示 (17)

3.5图像合并 (17)

3.5.1合并操作的基本步骤 (18)

3.5.2图像合并结果展示 (21)

3.6程序中存在的问题 (22)

3.6.1图像分割中的问题 (22)

3.6.2图像合并中的问题 (23)

结论 (25)

致谢 (26)

参考文献 (27)

1. 绪论

本毕业设计及毕业论文是在Microsoft Visual Studio 2008开发环境中,基于C++语言中的MFC类库实现的。什么是MFC? MFC(Microsoft Foundation Classes),是一个微软向开发者提供的功能类库(class libraries),以C++类的形式封装了Windows的大量API,集成了众多功能,并且包含一个应用程序设计框架,以减少开发人员的重复劳动规范软件设计。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

1.1 开发环境概述

1.1.1 Visual Studio 2008简介

Microsoft Visual Studio 2008是面向Windows Vista、Office 2007、Web 2.0的下一代开发工具,代号“Orcas”,是对以前版本的依次重大升级。Visual Studio 2008 提供了很多高级的开发以及调试工具,同时对数据库开发,网页开发提供的良好的支持。例如可视化软件设计器(使用 .NET Framework 3.5 加速开发)、对 Web 开发工具的大量改进,以及数据类型及多语言的支持。

改进1:原型程序快速开发

新设计的软件架构,有助于开发人员经行快速的原型开发,Visual Studio 2008 提供了诸多改进与数据功能,例如集成语言查询 (LINQ),多个编程人员可以利用这些功能更快捷的构建软件架构。Visual Studio 2008 还使开发人员能够从同一开发环境内创建面向多个 .NET Framework 版本的应用程序。开发人员能够建构面向 .NET Framework 多个版本的的应用程序,意味他们不必改变开发环境便可开发。

改进2:用户体验提升

Visual Studio 2008为软件开发人员发布了在新平台上创建紧密联系的应用程序的新工具,这些平台包括 Web、Windows Vista、Office 2007、SQL Server 2008 和Windows Server 2008。对于新一代Webk开发提供了良好支持。从而可以进行更高效,快速的Web程序从开发到设计的全过程。

改进3:团队协作的支持

Visual Studio 2008 提供多种功能帮助用户进行协作开发,有效提高了开发效率。这同时包括了专业的数据库支持与开发流程工具的支持。

1.2 开发语言概述

1.2.1 C++简介

C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间[1](name space)逐渐被加入标准。

1.2.2 C++优点

? C++继承了C的特点,直接高效。

? C++采用对象的设计风格,成为程序书写的时尚,同时也对面向过程的的语言进行

兼容。

? C++应用范围很广。

? C++性能高效,执行效率高,冗余代码少。

? C++设计成无需复杂的程序设计环境。

?出于要保证语言的运行效率,C++的提供了很多形式多样的类库。这方面的内容可以参考Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈

述。

?C++语言的集成度很高,首先C语言可以在C++中进行开发,多种其他语言也提供可对C++ 的接口。

?与Java类的方法,C++虽然上手难度大,学习曲线陡峭,但不可否认一旦掌握数量,就会成为程序设计的利器,其与其他语言复杂度的比较也不能单纯以上手难

易度来区分。程序效率,后期维护都需要纳入考虑。

1.2.3 C++缺点

C++的语言复杂是众所周知的,而且版本过多,不容易进行集成开发,难于维护,造

就了很多的遗留系统,对该系统进行维护也变成相当繁重的工作。

由于这种的复杂性,使得C++程序的质量很难得到保证。不同的人写出的程序质量相

差过大,虽然这些语言缺陷才不断改进,但C++语言仍然有漫长的路要走。

c++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很

多著名人士(比如Linux之父linus torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。

2.图像分割简介

要了解图像分割,我们首先不得不来解释一下什么是图像分割。图像分割就是指把图像分成各具特征的区域,并把我们感兴趣的目标提取出来的一门技术。对于一幅图像我们

肯定有感兴趣和不感兴趣的地方,而图像分割就能够把我们感兴趣的那一部分分割出来呈现在我们面前在实际图像处理中,一般情况下我们只是注意到图像中那些我们感兴趣的目标,因为只有这部分也就是我们注意到的有用的目标物才能为我们提供高效、有用的信息。而这些目标一般又都对应着图像中某些特定的、具有独特性质的区域。为了把这些有用的区域提取出来供我们人类使用,图像分割这门技术也就应运而生了。我们通常情况下所说的图像分割就是指把图像划分成若干个有意义的区域的过程,每个区域都是具有相近特性的像素的连通集合,一般情况下我们所关注到的那些有用的目标物就存在与这些区域中。

2.1图像分割概述

从上个世纪五六十年代起,图像分割算法的研发工作开始起步,这期间诞生了大量的分割算法,直到今日,给技术仍然才快速发展,这由于分割问题本身的复杂性与需求,造就了越来越多的学者在这一方向进行不断努力。

2.1.1图像分割的意义

图像分割给出对图像的初步理解,其完成的准确性直接决定了后续工作的进度,因此其具有很重要的现实意义和理论意义。

2.1.2图像分割的现状及未来

图像分割技术在多个领域都有很重的应用,由于图像的复杂性,我们很难找到一个统一的图像分割方法,根据图像的特点,充分收集图像先验,提取不同层次的特征,从底层的像素特征,到高层的特征,共同辅助分割过程。在未来,图像分割还会进行更全面的进化的发展,以用于各个专属领域。

2.2图像分割技术

关于图形人们突出了图通的要求,一个典型需求就是区分图像的前景和背景,从而为以后的处理做准备,因此诞生了许多的图像分割技术,本节将对这些技术进行概述。

2.2.1图像分割方法及其特点

2.2.1.1阈值分割

作为一种常见的图像分割方法,图像阈值化分割时间简介,相关运算较少,且性能较稳定成为得到较广泛应用的分割方法。当图像的背景与前景有较清晰的分割时,此方法表现良好。起具体实现过程是根据一个标准,按照图像灰度,对图像进行划分。它特别适用于目标和背景占据不同灰度级范围的图像。

2.2.1.2区域分割

区域分割类似于一种种子填充算法,也可以看成一种层次聚类的方法。通过任意选取的种子点,进行区域层长,直到达到某个停止条件位置,这样能够保证叫相似的的区域进行合并,这通常是背景区域。

2.2.1.3边缘分割

通过边缘检测进行图形分割也是一种重要的分割方法,当图像变化较剧烈的区域通常是边缘区域,这些边缘区域有助于区分前景和背静。图像的变化通常用梯度来刻画,也就是图像的求导操作。常用的边缘检测算子有,一阶微分算子Prewitt算子,Roberts算子、Prewitt算子和Sobel算子,二阶微分算子有Kirsh算子和Laplace算子算子等。在实际运算着中这些算子通过卷积直线,其共同的特点是对噪音表现较差。

2.2.1.4聚类分析

聚类分析是一种无监督的机器学习方法,通过定义多个数据点间的相似度,从而把相似的的分到同一簇中(cluster)中,同时保证不同簇中的点进可能不同。常用的聚类方法有k-means,谱聚类,层次聚类等。K-means 通过随机指定的类中心,从而把距离类中心最近点归到相应的分类,归类完毕后,再根据同一个类的点重新计算类中心。如此反复,直到类中心不在发生大的变化。该聚类算法简单易用,但易受到噪音的影响。谱聚类是利用数据点的拓扑结构,根据拉普拉斯矩阵,求解数据代嵌入空间的表示,再利用该表示用k-means方法聚类。层次聚类是把聚类过程层次化,顶层是所有点属于一个类,低层是每个点都是一个类,该聚类算法采用从底向上的顺序,依次合并相似的数据点。直到达到某个阈值终止条件为止。

3. 图像分割系统

功能简介

1.实现基本的图片聚类分割算法,并予以展现。

2.将分割后的图片再合并起来,并展现合并过程。

技术参数:

开发环境:Microsoft Visual Studio 2008

开发语言:C++语言

分割图片格式:jpg,bmp

分辨率:无限制

图片大小:无限制

相关定义:

欧氏距离(Euclid Distance)也称欧几里得度量、欧几里得距离,是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。

分割类:图像经过聚类分割计算后,生成的图像碎片就是分割类。

样本向量:多个像素的色彩信息组成的向量

样本容量:样本向量获取像素的个数

相似度=样本向量j*样本向量k/(样本向量j的长度*样本向量k的长度)步长:确定首次聚类中心间隔的长度以及聚类中心计算范围的值。

系统流程图:

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-1图像系统分割流程图

3.1图像获取

既然我们要做的是图像分割,我们首先要让用户选择一张图片,获取该路径,然后通过该路径该图片读入到内存中去,并将该内存地址获取到,交给下一步图像预处理,进行进一步的处理。同时再分割及合并完成后,为了方便向用户演示结果,我们也应将内存中分割或合并后的结果保存成文件,方便用户查看,所以我们也需要用户进行选择,分割或合并完成后分割后的图片以及合并后的图片的保存路径。

具体实现:

为了获取图片的路径,我选择创建了一个CFileDialog类的对象,并调用该对象的DoModal()显示对话框并使用户可以进行选择, 通过修改该对象m_ofn Windows

OPENFILENAME结构来设置对话框的基本参数,通过调用GetPathName()方法,返回选定文件的完整路径。

图片预览(以上图片仅供参考,可能会随系统不同效果略有不同):

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-2 打开图片对话框

通过以上操作,我们获得了图片文件的绝对路径,现在我们要做的是将其读入到内存中,并获取到其内存地址。

3.2图像保存

为了获取用户选择的保存路径,我选择调用SHBrowseForFolder()方法来显示一个选择对话框,通过修改其结构参数BROWSEINFO里的各成员,来修改对话框的各个属性,最后通过SHGetPathFromIDList(LPITEMIDLIST, Buffer)方法来获取保存文件的文件路径,并将其保存到Buffer中。

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-3 选择保存路径对话框

通过创建一个bitmap类型的对象,将图片缓存传入,并设置图片的格式及其他参数,调用bitmap对象的save()方法就可以实现图片的保存。

3.3图像预处理

图像预处理指的是在图像分割前和图像合并前,将图片的色彩信息进行相应的转换,方便在分割时,和合并时,对其颜色信息进行计算和比较。

本系统中,分割时采用LAB色彩模型,合并时采用RGB色彩模型。以下是详细信息。

3.3.1 Lab色彩模型

Lab色彩模型是由亮度(L)和有关色彩的a, b三个要素组成。L表示亮度(Luminosity),a表示从洋红色至绿色的范围,b表示从黄色至蓝色的范围。L的值域由0到100,L=50时,就相当于50%的黑;a和b的值域都是由+127至-128,其中+127 a就是洋红色,渐渐过渡到-128 a的时候就变成绿色;同样原理,+127 b是黄色,-128 b是蓝色。所有的颜色就以这三个值交互变化所组成。例如,一块色彩的Lab值是L = 100,a = 30, b = 0, 这块色彩就是粉红色。

优点:

Lab色彩模型除了上述不依赖于设备的优点外,还具有它自身的优势:色域宽阔。它不仅包含了RGB,CMYK的所有色域,还能表现它们不能表现的色彩。人的肉眼能感知的色彩,都能通过Lab模型表现出来。另外,Lab色彩模型的绝妙之处还在于它弥补了RGB色彩模型色彩分布不均的不足,因为RGB模型在蓝色到绿色之间的过渡色彩过多,而在绿色到红色之间又缺少黄色和其他色彩。

如果我们想在数字图形的处理中保留尽量宽阔的色域和丰富的色彩,最好选择Lab。

代码实现:由于计算机中存储的图像信息采用的是RGB模型,而并没有RGB直接到Lab 模型的方法,所以选择将RGB先转化为XYZ颜色空间(1931年CIE在RGB系统基础上,改

用三个假想的原色X、Y、 Z建立了一个新的色度系统。将它匹配等能光谱的三刺激值,定名为"CIE1931 标准色度观察者光谱三刺激值",简称为"CIE1931标准色度观察者"。这一系统叫做"CIE1931标准色度系统"或称为" 2°视场XYZ色度系统"),XYZ颜色空间再转化到Lab。

3.3.2 RGB色彩模型

RGB模型也称为加色法混色模型。它是以RGB三色光互相叠加来实现混色的方法,因而适合于显示器等发光体的显示。其混色规律是:以等量的红、绿、蓝基色光混合时。

其配色方程描述:

F(物体颜色)=R(红色的百分比)+G(绿色的百分比)+B(蓝色的百分比)

RGB色彩空间根据实际使用设备系统能力的不同,有各种不同的实现方法。截至2006年,最常用的是24-位实现方法,也就是红绿蓝每个通道有8位或者256色级。基于这样的24-位RGB 模型的色彩空间可以表现 256×256×256 ≈ 1670万色。一些实现方法采用每原色16位,能在相同范围内实现更高更精确的色彩密度。这在宽域色彩空间中尤其重要,因为大部分通常使用的颜色排列的相对更紧密。

代码实现:由于计算机存储像素信息采用的就是RGB模型,直接获取像素的信息,取最高的8位,中间8位,最低8位就是相应的R、G、B的信息。

3.4聚类图像分割

聚类分割的原理就是比较图像中的像素信息与聚类中心的像素信息哪个更为相似,则将该像素置于那个与其最相似的聚类中心之下,将图像的全部像素进行数次聚类收敛后,聚类分割就完成了,这个过程也就叫聚类图像分割。

聚类算法的一般步骤:

(1)从 n个数据对象任意选择 k 个对象作为初始聚类中心;

(2)循环(3)到(4)直到每个聚类不再发生变化为止;

(3)根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;

并根据最小距离重新对相应对象进行划分;

(4)重新计算每个(有变化)聚类的均值(中心对象)。

3.4.1首次确定聚类中心

要完成聚类分割,首先要找的就是聚类中心,有了聚类中心我们才能确定,图像的每个像素归属到哪?不同的聚类中心,就把图像分成了不同的图像碎片。而在确定聚类中心之前,我们还需要确定步长。什么是步长?图中的黑点为聚类中心,两个黑点之间的距离就是步长。

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-4图像分割中的聚类中心

步长直接确定了聚类中心之间的间隔,以及聚类中心的位置。

那步长又是什么决定的?步长是由用户输入的第一个值,

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-5用户输入参数实例

来决定的。具体是

int STEP = sqrt(double(height*width/superpixelsize))+0.5;

确定之后也就确定了聚类中心的个数以及位置,前面我们已经获取了图像的Lab颜色信息以及图像大小等信息。现在我们通过聚类中心的位置,可以获取到聚类中心的颜色信息,我们将聚类中心的颜色和位置信息存取到准备好的容器(vector)中去,为后面的聚类计算做好准备。

实现代码:

void SLIC::GetLABXYSeeds_ForGivenStepSize(

vector& kseedsl,

vector& kseedsa,

vector& kseedsb,

vector& kseedsx,

vector& kseedsy,

const int& STEP,

const bool& perturbseeds,

const vector& edgemag)

{

int numseeds(0);

int n(0);

int xstrips = (0.5+double(m_width)/double(STEP)); //一行能容纳多少个步长

int ystrips = (0.5+double(m_height)/double(STEP));//一列能容纳多少个步长

numseeds = xstrips*ystrips; //一共有多少个步长区域

int xerr = m_width - STEP*xstrips;if(xerr < 0){xstrips--;xerr = m_width - STEP*xstrips;}

int yerr = m_height - STEP*ystrips;if(yerr < 0){ystrips--;yerr = m_height- STEP*ystrips;}

double xerrperstrip = double(xerr)/double(xstrips);

double yerrperstrip = double(yerr)/double(ystrips);

int xoff = STEP/2; //偏移信息

int yoff = STEP/2; //偏移信息

kseedsl.resize(numseeds);

kseedsa.resize(numseeds);

kseedsb.resize(numseeds);

kseedsx.resize(numseeds);

kseedsy.resize(numseeds);

for( int y = 0; y < ystrips; y++ )

{

int ye = y*yerrperstrip;

for( int x = 0; x < xstrips; x++ )

{

int xe = x*xerrperstrip;

int seedx = (x*STEP+xoff+xe); //聚类中心的位置信息

int seedy = (y*STEP+yoff+ye);//聚类中心的位置信息

int i = seedy*m_width + seedx;

kseedsl[n] = m_lvec[i]; //聚类中心的色彩信息

kseedsa[n] = m_avec[i];//聚类中心的色彩信息

kseedsb[n] = m_bvec[i]; //聚类中心的色彩信息

kseedsx[n] = seedx;

kseedsy[n] = seedy;

n++;

}

}

}

3.4.2聚类计算

3.4.2.1确定聚类计算区域

在聚类计算之前,我们首先要确定聚类中心附近距离为多少的像素要对其进行聚类计算。由于我们之前已经根据用书的输入,得到了步长。在这里我们规定每个聚类中心计算区域为以该聚类中心为中心以2个步长为边长的正方形区域。以聚类中心1和2举例,如下图:

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-6 聚类中心计算区域示例图

对应到具体图片上:

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-7聚类中心计算实例图

3.4.2.2计算距离

我们这里所说的距离指的是欧氏距离,在二维空间中的欧氏距离就是两点之间的直线段距离。在这里我们要计算两点之间的两个欧氏距离,一个是Lab颜色空间的欧氏距离,另一个是在图像中的两点之间位置的欧氏距离。为什么我们要计算两个距离,因为我们分割图像时,不仅要关注两点之间的色彩差距,还要关注两点之间的位置差距。从某种意义上讲,色彩上的距离更重要,因为分割的是色彩上有共性的区域。因此我们最终判断的距离是色彩的欧氏距离加上位置上的欧氏距离再乘以一个权重。这个权重跟用户输入的第二个值

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-8用户输入参数二实例图

还有步长有关。具体来说

权重=1.0/((STEP/compactness)*(STEP/compactness));

最终距离=色彩欧氏距离+位置欧氏距离*权重;

计算时,计算每个像素所能够对应的聚类中心,找到那个距离最短的聚类中心,说明

该像素与该聚类中心是一类,分割时应分割到一个图片碎片中去。这样就把该像素从原有图像中分割出来了。

代码实现:

for( int n = 0; n < numk; n++ )

{

double invwt = 1.0/((STEP/M)*(STEP/M)); //权重

y1 = max(0.0, kseedsy[n]-offset); //聚类区域范围

y2 = min((double)m_height, kseedsy[n]+offset);

x1 = max(0.0, kseedsx[n]-offset);

x2 = min((double)m_width, kseedsx[n]+offset);

for( int y = y1; y < y2; y++ )

{

for( int x = x1; x < x2; x++ )

{

int i = y*m_width + x;//像素

l = m_lvec[i];

a = m_avec[i];

b = m_bvec[i];

dist = (l - kseedsl[n])*(l - kseedsl[n]) +

(a - kseedsa[n])*(a - kseedsa[n]) +

(b - kseedsb[n])*(b - kseedsb[n]);//色彩距离

distxy = (x - kseedsx[n])*(x - kseedsx[n]) +

(y - kseedsy[n])*(y - kseedsy[n]);//位置距离

dist += distxy*invwt;//最终距离

if( dist < distvec[i] )

{

distvec[i] = dist;

klabels[i] = n; //i像素属于第N个分割类

}

}

}

}

3.4.3重新计算聚类中心

再次计算聚类中心时和第一次就有所不同了,这一次计算是根据上面聚类计算完成后,对每个分割类,进行色彩和距离上的平均,这个均值不对应任何一个像素,即使位置信息

可以对的上,其颜色信息也不一定对的上。下图黄色选中区域为分割类1,它的新聚类中心不对应它里的任何一个像素,而是属于分割类1的所有像素的色彩信息和位置信息的平均,即所有信息之和除以像素个数。

下图为一次聚类计算后的图片:

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-9第一次聚类计算后的图片效果

代码实现

for( int r = 0; r < m_height; r++ )

{

for( int c = 0; c < m_width; c++ )

{

sigmal[klabels[ind]] += m_lvec[ind]; /该分割类的色彩信息求和

sigmaa[klabels[ind]] += m_avec[ind];

sigmab[klabels[ind]] += m_bvec[ind];

sigmax[klabels[ind]] += c; //该分割类的位置信息求和

sigmay[klabels[ind]] += r;

clustersize[klabels[ind]] += 1.0; //该分割类像素个数

ind++;

}

}

}

{for( int k = 0; k < numk; k++ )

{

if( clustersize[k] <= 0 ) clustersize[k] = 1;

inv[k] = 1.0/clustersize[k]; //该分割类像素个数的倒数}}

{for( int k = 0; k < numk; k++ ) //求平均结果即为新的聚类中心{

kseedsl[k] = sigmal[k]*inv[k];

kseedsa[k] = sigmaa[k]*inv[k];

kseedsb[k] = sigmab[k]*inv[k];

kseedsx[k] = sigmax[k]*inv[k];

kseedsy[k] = sigmay[k]*inv[k];

}}

3.4.4聚类分割后的优化

通过多次的聚类分割计算和重新计算聚类中心,我们的图像分割大体已经完成。但是

还存在个问题。如下图:

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-10未使用优化函数的分割效果图

图中区域,四周都被同一分割类包围(包括小点),按照标准来说该分割类应该属于包围着它的分割类。为了解决该问题在分割后加入一个优化检测函数,检测每个分割类是否被同一个分割类包围,若是则将此分割类的全部像素归入到包围它的那个分割类,同时取消这个分割类。

使用优化函数后如下对比图所示,原有的分割类消失,并入到外部的分割类。

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

基于聚类的图像分割系统的设计与实现——分割算法模块【毕业作品】

3-11未使用与使用优化函数的对比图

相关文档
  • 谱聚类图像分割

  • 图像分割算法的研究

  • 聚类图像分割

  • 图像分割毕业论文