基于K-means的图像分割一、实验目的(1)通过K-means聚类实现图像分割,在实验板上观察实验效果。(2)掌握VisualDSP++5.0的使用。二、实验环境(1)软件:WindowsXp、VisualDSP++5.0(2)硬件:仿真器、EBF-561实验平台三、算法描述图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。近年来,图像分割在实际工程中已经得到了广泛应用。本次实验主要用到的分割算法为K-means算法。K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。其原理为:先取k个初始距离中心。计算每个样品到这k个中心的距离,找出最小距离把样品归入最近的聚类中心,修改中心点的值为本类所有样品的均值,再计算各个样品到k个中心的距离,重新归类、修改新的中心点,直到新的距离中心等于上一次的中心点时结束。此算法的结果受到聚类中心的个数以及初始聚类中心的选择影响,也受到样品几何性质及排列次序影响。如果样品的几何特性表明他们能形成几个相距较远的小块孤立区域,则算法多能收敛。根据原理,可定义准则函数为:2i1(x-u)jikjixSK算法原理可以解释如下:四、算法步骤输入:k,data[n](1)选择k个初始中心点,例如c[0]=data[0],……,c[k-1]=data[k-1];(2)对于data[0],……,data[n],分别与c[0],……,c[k-1]比较,假设c[i]差值最少,就标记为i;(3)对于所有标记为i点,重新计算c[i]={所有标记为i的data[i]z之和}/标记为i的个数;(4)重复(2)(3),直至所有c[j]值的变化小于给定阈值。五、实现结果按照下列步骤,程序正确运行,得到正确的分割结果。(1)上机完善图像分割k-means算法程序;(2)搭建实验硬件环境;(3)打开VisualDSP++集成开发环境,建立Session状态;(4)打开并运行工程;(5)调试程序;(6)在实验板上检查分割效果。六、算法阐述K-means算法是一种得到最广泛使用的基于划分的聚类算法,把n个对象分为k个簇,以使簇内具有较高的相似度。相似度的计算根据一个簇中对象的平均值来进行。这样的特性就导致了算法对初始值敏感,对于不同的初始值,可能会导致不同的聚类结果,而且对于“噪声”和孤立数据敏感,少量的该类数据能够对平均值产生极大影响,针对这些问题,可以通过数据预处理、优化初始聚类中心选择、改良迭代过程中聚类中心的选择来改进算法。七、主要程序及解释要求:bmpimage.imgbuf为图像数据首地址,指针类型;图像宽度变量为bmpimage.infohead.biWidth,高度为bmpimage.infohead.biHeight;分割结果(不同区域标识对应的灰度值)要求仍然存储在bmpimage.imgbuf为首地址的区域。intk,j;intsize;//存储图片灰度数据的个数intsum1,sum2;//两类总灰度值大小总和intcount1,count2;//两类总样本的个数unsignedcharc[3];unsignedchar*data;data=bmpimage.imgbuf;c[1]=data[1];//初始化两类聚类中心,分别去第1个和第1000个数据点的灰度值c[2]=data[1000];size=bmpimage.infohead.biWidth*bmpimage.infohead.biHeight;intlabel[N];//存储各个样本点的类别for(j=0;j30;j++)//迭代30次{sum1=0;//初始化变量sum2=0;count1=0;count2=0;for(k=0;ksize-1;k++){if(pow((data[k]-c[1]),2)=(pow((data[k]-c[2]),2)))//判断各个样本到聚类中心的距离,哪个近,就分到哪一类{label[k]=2;//第2类,样本综合更新,个数更新sum2=sum2+data[k];count2++;}else{label[k]=1;sum1=sum1+data[k];count1++;}}c[1]=sum1/count1;//更新聚类中心c[2]=sum2/count2;}for(k=0;ksize-1;k++)//为了让其差别更明显,两类分别取灰度值0,255,便于检查聚类效果{if(label[k]==1)data[k]=0;elsedata[k]=255;}八、实验总结在刚开始编程的时候走了一些弯路,主要是因为对算法原理理解的不够透彻,后来,在老师和同学的帮助下,理清了编程的思路,顺利的编写完算法,并且成功运行。在将程序下载到板子上的时候也出现了一些问题,比如说图像显示不清楚,在最大化两类距离后,效果好了很多,与此同时,板子也有一些问题,不过,在更换板子后,问题都顺利的得到了解决,成功的对图片进行了2分割。