通过K-均值聚类算法对图像进行分割。
二.算法概要 图像分割是一种重要的图像分析技术。在对图像的研究和应用中,人们往往仅对图像中的某些部分感兴趣。这些部分常称为目标或前景(其他部分称为背景)。它们一般对应图像中特定的、具有独特性质的区域。为了辨识和分析图像中的目标,需要将它们从图像中分离提取出来,在此基础上才有可能进一步对目标进行测量,对图像进行利用。图像分割就是把图像分成各具特性的区域并提取出感兴趣目标的技术和过程。
k-means 算法的工作过程说明如下:
首先从n个数据对象任意选择k 个对象作为初始聚类中心;
而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;
然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);
不断重复这一过程直到标准测度函数开始收敛为止。
K-均值算法过程:
(1) 从 N个数据对象任意选择 k 个对象作为初始聚类中心;
(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并 根据最小距离重新对相应对象进行划分;
(3) 重新计算每个(有变化)聚类的均值(中心对象);
(4)迭代(2)(3)直到聚类中心与原质心想得或差值小于指定阈值,算法结束。
三.算法具体步骤
输入:K,图像灰度值(设为date[n]);
(1)选择K个聚类中心:如:c[0]=date[0],……,c[k-1]=date[k-1];
(2)对于date[0],……,date[n],分别计算与c[0],……c[k-1]的距离。若c[i]距离最小,记为i ;
(3)对于所有标记为i的点,重新计算c[i]=(所有标记为i的样本之和)/标记为i的个数;
(4)重复(2)(3),直至所有c[j]值变化小于给定阈值。
四.试验部分程序(三分类)
unsigned int c[3]={10,100,200},i,m[3],p,num[3]={0,0,0},sum[3]={0,0,0},j,n;
for(j=0;j<20;j++)
{
for(i=0;i<N;i++)
{
for( n=0;n<3 n=”” m=”” n=”” abs=”” bmpimage=”” imgbuf=”” i=”” -c=”” n=”” if=”” m=”” 0=””>m[1])
{if(m[1]>m[2]) n=2;
else n=1;}
else
{if(m[1]>m[2])
{if(m[0]>m[2]) n=2;
else n=0;}
else n=0;}
switch(n)
{case 0:{num[0]++;sum[0]=sum[0]+bmpimage.imgbuf[i];
bmpimage.imgbuf[i]=c[0];break;}
case 1:{num[1]++;sum[1]=sum[1]+bmpimage.imgbuf[i];bmpimage.imgbuf[i]=c[1];break;}
case 2:{num[2]++;sum[2]=sum[2]+bmpimage.imgbuf[i];bmpimage.imgbuf[i]=c[2];break;}}}
c[0]=sum[0]/num[0];
c[1]=sum[1]/num[1];
c[2]=sum[2]/num[2];}