模糊C均值聚类图像分割算法的C++实现
2017-12-12游继安
刘 衣,游继安
(湖北工程学院 新技术学院,湖北 孝感 432000)
模糊C均值聚类图像分割算法的C++实现
刘 衣,游继安
(湖北工程学院 新技术学院,湖北 孝感 432000)
利用C++语言和OPENCV仿真工具,实现了模糊C均值聚类算法的图像分割。回顾了模糊C均值聚类算法的原理,详细说明了如何将聚类算法和图像分割进行关联。描述了整个仿真的每一个函数的算法原理和流程,对比分析了不同图像分割的实验结果,最后探讨了模糊C均值聚类算法需要改进的一些问题。
C++;OPENCV;模糊C均值;聚类;图像分割
图像分割是目标跟踪、车辆自动驾驶等技术的基础,是图像处理技术的一个研究热点。目前图像分割问题没有一种普遍适用的求解算法,一般只能针对不同领域中的问题设计不同的算法[1]。图像分割可分为基于层次的分割和基于块的分割,基于块的分割方法又可分为基于区域的分割和基于边缘或边界的分割。本文研究基于区域分割的图像分割问题[1]。另外,模糊聚类广泛应用在远程感知、医学图片等领域。在图像分割中,模糊C均值聚类算法是一种应用最广泛的聚类算法,常用于数据挖掘、机器视觉等领域。传统的模糊C均值算法对大多数无噪声图片的分割很有效[2]。于是,很多方法都以模糊C均值算法为基础,对其加以改进以适应某些图像分割,如利用迁移学习改进的知识杠杆迁移模糊C均值(KL-TFCM)算法[3],等等。
本文利用C++语言和OPENCV工具,在VS2015平台上进行了编程,分别从初始聚类数、灰度和彩色维度探讨了实验结果。
1 模糊C均值(FCM)简介
FCM聚类算法的目标函数可描述为式(1):
(1)
(2)
(3)
为了便于编程,对式(2)进行变换可得式(4):
(4)
2 FCM与图像分割的关联
(1)设置目标函数精度ε,模糊指数m(通常取值为2),最大迭代次数maxTimes;
(2)初始化模糊聚类中心P;
(3)由公式(4)和(3)分别更新隶属度矩阵和聚类中心,若样本点和聚类中心的距离为0,则将该点与相对应类的隶属度值设为1;
(4)计算每个样本点到每个类的聚类中心的距离,并按照公式(1)计算目标函数值J;
(5)若达到最大迭代次数或前后两次J的绝对值差小于ε,则停止计算,否则转到第(3)步。
(6)将样本点划分为隶属度最大的那一类。
算法流程图如下:
图1 算法流程图
3 程序的实现
头文件的定义。利用C++语言,在头文件里针对灰度图像和彩色图像定义两种类型的结构体数据,分别为GrayClusterData和ColorClusterData。在GrayClusterData定义变量size_t x,size_t y, uchar pixelVal,分别存储像素点的x,y坐标值和灰度值。在ColorClusterData里面定义size_t x, size_t y, uchar RGBValue[3],分别存储像素点的x,y坐标值和彩色图像像素点的B、G、R三个值。
在头文件里还定义一个ClusterMethod类,里面的成员变量有IplImage*mpOrgImage,IplImage*mpGrayImage,size_tmpClusterResult,double*mpCenters,分别用来存储原始图像,灰度图像,聚类结果和聚类中心。size_t mSampleNum为样本数,size_t mClusterNum为聚类数,size_t mFeatureNum为每个样本的特征数,size_t mImageWidth为原始图像宽,size_t mImageHeight为原始图像高,CvRNG mRNG为随机数种子,可用cvRNG(cvGetTickCount()) 进行初始化,GrayClusterData*mpGraySampleData用来存储灰度图像的样本总数据,ColorClusterData*mpColorSampleData用来存储彩色图像的样本总数据。所有的成员变量都是private类型。
public成员函数有void GetClusteredImage(IplImage*pOrginalImage, IplImage*pClusteredImage, size_t clusterNum),用于传输原图像pOrginalImage,获取分割后的图像pClusteredImage,值得注意的是,pOrginalImage和pClusteredImage都需要由外界去开辟图像空间。
Private成员函数有void Initialize(IplImage*pOrginalImage, size_t clusterNum),用来初始化各种变量,pOrginalImage为原图像,clusterNum为聚类数。void FuzzyCMeans(int m_value),模糊C均值算法的入口,m_value的值一般为2。void FuzzyCInitialize(double*pMemberShip, double*pDistances)为聚类的初始化,pMemberShip存储总样本隶属度,pDistances存储每一个样本点到每一个聚类中心点的距离平方值。void FuzzyCCalculate(double*pMemberShip, double*pDistances, int m_value)用来计算模糊C均值聚类,void ClusteredResult(double*pMemberShip)用来计算聚类结果并分类,将每一个样本点归为隶属度最大的那一类。
成员函数间的调用。GetClusteredImage函数是仅有的外部接口,main函数通过调用它,传递原图像数据和获取分割后的图像能。该函数在内部依次调用Initialize和FuzzyCMeans,最后将pClusteredImage中每个像素点的值,按照它属于的类,依次进行赋值,这样整幅图像就被分成了c个类的值了。
FuzzyCMeans函数按顺序分别调用FuzzyCInitialize、FuzzyCCalculate和ClusteredResult三个函数。调用的结构见图2,按照1-6的顺序执行。首先在main函数中定义原图pOrginalImage,分割后的图像pClusteredImage,和聚类数clusterNum,然后将3个参数传递给GetClusteredImage,最后用pClusteredImage存储分割后的图像。
图2 成员函数调用流程
数据的赋值。大部分数据的赋值工作由Initialize成员函数完成,根据外部传递进来的图像数据进行赋值。在Initialize函数中开辟mpGraySampleData和mpColorSampleData空间,存储原始灰度和彩色图像的数据。
模糊C均值聚类算法的实现。模糊C均值算法的实现由FuzzyCMeans函数完成,在该函数里,开辟了存储总样本隶属度pMemberShip、样本与聚类中心距离平方的集合pDistances、聚类中心点集合mpCenters和聚类结果集合mpClusterResult的空间。在调用完FuzzyCInitialize、FuzzyCCalculate和ClusteredResult函数后,还需要负责释放非成员变量pMemberShip和pDistances动态开辟的空间。
模糊C聚类算法初始化与计算。聚类算法的初始化是通过FuzzyCInitialize实现的,其作用是初始化聚类中心和初始化样本与聚类中心距离平方的集合(简称距离矩阵)。FCM算法的计算通过FuzzyCCalculate实现,主要是计算隶属度和聚类中心以及相邻两代目标函数值的绝对差,根据公式(3)和公式(4),分别得出每次迭代更新的聚类中心和隶属度,并求出聚类中心更新后的样本点到每个聚类中心的距离矩阵。若前后两次的目标函数值小于允许误差或运行次数超过最大迭代次数,则终止计算,否则重新计算隶属度、聚类中心和距离矩阵。
聚类结果的计算。把每个样本所属类的值存储到mpClusterResult中。该过程是通过ClusteredResult函数实现的,它将每个样本点的隶属度进行比较,将隶属度最大的类赋给该样本,并存储到mpClusterResult中。
4 实验结果
本文采用两幅彩色图进行对比实验,原图为图3所示,其中Lena像素分别率为512*512,JLK Magenta像素分辨率是586*764。实验电脑配置:CPUi7 7700HQ,内存8G,win10 x64系统,硬盘为固态硬盘128G。
对于灰度图像,采用模糊C均值聚类算法和分水岭算法进行对比研究;对于彩色图像,仅采用模糊C均值聚类算法。
4.1灰度图像分割
首先,对图3中的Lena用模糊C均值聚类算法进行图像分割,以灰度像素值为样本特征值,设置聚类数目分别为2和5,图像分割的结果见图4。
Lena JLK Magenta图3 原始图像
对JLK Magenta进行灰度图像分割的结果如图5所示。
聚类数为2 聚类数为5图5 JLK Magenta灰度分割后的图像
将程序各运行10次可知,不同聚类数和分辨率的图像分割时间不同,聚类数越多,运行时间越长;JLK Magenta图像分割比Lena图像分割的运行时间长。表1和表2分别记录了Lena图像分割和JLK Magenta图像分割的运行时间和平均运行时间。
表1 灰度Lena不同聚类数的运行时间(单位:秒)
表2 灰度JLK Magenta不同聚类数的运行时间(单位:秒)
再对Lena和JLK Magenta图像分别用分水岭算法进行分割,结果如图6所示。
将图4和图6的Lena分析可得,图4分割清晰准确,区域划分简洁明朗,图6的Lena中局部图像区域划分过多。图4中,当聚类数为2时,区域划分更为简洁,当聚类数为5时,图像分割更精细。
将图5和图6的JLK Magenta做对比可知,图5边缘分割精确,当聚类数为2时,整体分为两大类,整个人体的轮廓清晰可见,但具体的细节不够,如眼睛等;当聚类数为5时,细节信息显露得十分清楚。而图6的JLK Magenta区域划分不准确,局部区域分割过多,细节信息偏少。
4.2彩色图像分割
对图3的两幅图像做彩色图像分割,以R、G、B三个空间的像素值作为样本的特征值,设置聚类数目分别为2和5,对Lena和JLK Magenta分别进行图像分割,其结果见图7和图8。
Lena JLK Magenta 图6 Lena分水岭算法
分别将程序运行10次,对于Lena的彩色和JLK Magenta的彩色图像分割时间对比见表3和表4。
表3 彩色Lena不同聚类数的运行时间(单位:秒)
表4 彩色JLK Magenta不同聚类数的运行时间(单位:秒)
5 实验结论
将表1和表3对比,表2和表4对比可以看出,同一张图片,在相同聚类数的情况下,对灰度和彩色图像进行分割,运行时间差异很大,故一个样本的特征数目越多,运行时间越长。将表1和表2对比,表3和表4对比可以看出,对于分辨率不一样、其他情况相同的图片,运行时间也是不同的,分辨率越大的,运行时间越长。单独看表1、2、3、4,对于同一张图片,聚类数不同,其他条件均相同的图片,聚类数越多,所消耗的时间越长。上述图像中当聚类数为2时,切割后的图像的信息显得丢失不少,而当聚类数为5时,运行的时间大幅增加,故在确定聚类数的时候需要有一个权衡。将图4与图5对比,图6与图7对比,可以看出,模糊C均值聚类算法的图像分割效果比分水岭算法要好很多,分水岭算法在图像局部区域过多分割,而且图像边缘也没有模糊C均值聚类算法检测的精确。总体上看,对于无噪声的图片,模糊C均值算法要优于分水岭算法,但要达到实时图像处理,还需要进一步改进算法。本文的程序运行时间较长,需要对模糊C均值算法进行改进和优化。由于模糊C均值算法对含有噪声的图片很敏感,所以没有详细讨论,如何抗噪,也是需要改进的一个方向。另外,在运行程序前,需要人为根据实际图片,凭经验确定分类数目,无法进行自动确定分类数,从而无法对图像进行自动分割。如何进行自动确定图像分类数也是以后需要改进的一个方向。
[1] Zaitoun N M, Aqel M J. Survey on Image Segmentation Techniques[J].Procedia Computer Science, 2015, 65(4):797-806.
[2] Zhang M, Jiao L, Ma W, et al. Multi-objective evolutionary fuzzy clustering for image segmentation with MOEA/D[J].Applied Soft Computing, 2016(48): 621-637.
[3] Qian P, Zhao K, Jiang Y, et al. Knowledge-leveraged transfer fuzzy C-Means for texture image segmentation with self-adaptive cluster prototype matching[J].Knowledge-Based Systems, 2017(130): 33-50.
[4] 江铭炎,袁东风.人工蜂群算法及其应用[M].北京: 科学出版社,2014:195-197.
(责任编辑:熊文涛)
TP391.41
A
2095-4824(2017)06-0091-06
2017-09-05
刘 衣(1986- ),男,湖北孝感人,湖北工程学院新技术学院助教,硕士。
游继安(1987- ),男,湖北孝感人,湖北工程学院新技术学院助教,硕士。