基于K-means的图像分割.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于K-means 的图像分割 一、实验目的 (1)通过K-means聚类实现图像分割,在实验板上观察实验效果。 (2)掌握VisualDSP++5.0的使用。 二、实验环境 (1)软件:WindowsXp、VisualDSP++5.0 (2)硬件:仿真器、EBF-561实验平台 三、算法描述 图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。近年来,图像分割在实际工程中已经得到了广泛应用。 本次实验主要用到的分割算法为K-means算法。K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。其原理为:先取k个初始距离中心。计算每个样品到这k个中心的距离,找出最小距离把样品归入最近的聚类中心,修改中心点的值为本类所有样品的均值,再计算各个样品到k个中心的距离,重新归类、修改新的中心点,直到新的距离中心等于上一次的中心点时结束。此算法的结果受到聚类中心的个数以及初始聚类中心的选择影响,也受到样品几何性质及排列次序影响。如果样品的几何特性表明他们能形成几个相距较远的小块孤立区域,则算法多能收敛。 根据原理,可定义准则函数为: 算法原理可以解释如下: 四、算法步骤 输入: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为首地址的区域。 int k,j; int size; //存储图片灰度数据的个数 int sum1,sum2;//两类总灰度值大小总和 int count1,count2;//两类总样本的个数 unsigned char c[3]; unsigned char *data; data= bmpimage.imgbuf; c[1] = data[1];//初始化两类聚类中心,分别去第1个和第1000个数据点的灰度值 c[2] = data[1000]; size = bmpimage.infohead.biWidth * bmpimage.infohead.biHeight; int label[N];//存储各个样本点的类别 for(j=0;j30;j++) //迭代30次 { sum1 = 0;//初始化变量 sum2 = 0; count1 = 0; count2 = 0; for(k = 0;k size - 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];

文档评论(0)

e71ah65wn9 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档