基于K-means算法的树叶分类

       现有n片不同种类的树叶,编写程序,完成对它们的自动分类。采用基于K-means算法的方法来完成分类。

       K-means算法的处理流程如下。首先,随机或按一定规则选择k个对象,每个对象代表一个簇的初始均值或中心。对剩余的每个对象,根据其与各个簇均值的距离,将它指派到与之最相近的簇中。然后计算每个簇新的均值。不断重复这个过程,直到数据的划分不再发生变化。

       整个分类算法的伪代码:

input:n //样本数
      k //欲分类数
      mrows //行像素
      ncols //列像素
for i=1 to n
      读取图片i;
      改变图片i的像素数为mrows*ncols;
      将真彩图像转换为灰度图;
      将像素矩阵转换为行向量leafs(i);
end;
调用K-means算法对leafs矩阵进行自动聚类;
返回聚类结果;
end;
        Matlab源代码:

function idx=kmean( )
n=input('输入样本总数n:   ');
k=input('输入要分成的类数k:   ');
mrows=input('输入行像素mrows:     ');
ncols=input('输入行像素ncols:     ');
leaf=cell(1,n);
leafs=rand(n,mrows*ncols);
for i=1:n
    imageName=strcat(num2str(i),'.jpg'); %图片名为1.jpg,2.jpg……n.jpg
    leaf{i}=imread(imageName); %读取图片
    leaf{i}=imresize(leaf{i},[mrows,ncols]); %统一图片的像素数
    leaf{i}=rgb2gray(leaf{i}); %真彩图转为灰度图
    leafs(i,:)=reshape(leaf{i},1,mrows*ncols); %将矩阵转成向量,所有向量统一保存在leafs矩阵中
end
idx=kmeans(leafs,k);%调用kmeans函数,返回分类结果
end
实验样本(n=12,k=5):

基于K-means算法的树叶分类

分类结果:

(1)基于K-means算法的树叶分类

(2)基于K-means算法的树叶分类

(3)基于K-means算法的树叶分类

(4)基于K-means算法的树叶分类

(5)基于K-means算法的树叶分类

由实验结果可见,分类效果基本令人满意。

不足与改进:

1.K-means算法需要用户首先确定k值,确定不恰当的k值将使得分类效果较差。K-means算法是一种典型的划分聚类方法,聚类结果可以用层次聚类方法作为验证,层次聚类方法具有自底向上、逐步聚类的优点,两相结合,可以取得令人满意的聚类结果。

2.K-means算法初始化采用随机取点的方法,可能会使算法产生收敛到局部最优而难以发现全局最优。可以采用模拟退火算法与K-means算法的结合来解决此问题[2]。

        3.K-means算法对于孤立点数据或噪声数据是敏感的,少量的该类数据能够对平均值产生较大的影响。在处理有孤立点或噪声的数据时,可采用K-medoids算法,该算法采用簇中最接近簇均值的点来表示簇,更具有鲁棒性。

你可能感兴趣的:(K-MEANS算法,图像分类,数学建模)