最近写了两个关于遥感图像的简单的非监督分类算法KMEAN和ISODATA,发现结果和ENVI的一直有差异,而且还蛮大的,找了好久也没有找到原因。于是用PS自己绘制了一个简单的图像用于测试。如图1所示,该图*有四个颜色(类别),四个角为绿色,上下为蓝色,左右为红色,中心为黄色。按道理来说,非监督分类应该初始种子点设置为4类应该可以将该图像分为四类。
图1 使用PS绘制的测试图像
首先使用ENVI自带的KMEAN分类,初始类别个数设置为5类,迭代次数为5,其他参数默认。图2是处理的结果。我自己写的KMEAN参数也是初始类别个数为5,迭代次数为5,处理结果见图3。从图2和图3对比可以看出,ENVI的结果就剩下2类,四周全部合并为一类,中间的黄色为另外一类。图3中处理的结果与原图一样,颜色是随机给的,所以颜色和原图不一样,类别个数还是5类。由于KMEAN对初始种子点的选取比较敏感,不知道ENVI的种子点是如何选取的,我自己使用随机数进行选取。
图2 ENVI的KMEAN处理结果
图3 我写的KMEAN处理结果
接下来再看看ISODATA分类的结果,和上面一样,初始类别个数设置为5和10,也就是最小五类,最大十类。迭代次数还是5次,图4是使用ENVI处理的结果,图5是我自己写的结果。对比发现,ISODATA相对KMEAN来说,效果要好一些(仅仅以图1中的数据来说),总共找出了四类,中间的和左右两边的合并为一类了。而我自己写的和原图类别个数保持一致,至少说明我写的没有错误。
图4 ENVI的ISODATA处理结果
图5 我写的ISODATA处理结果
下面是我写KMEAN和ISODATA算法参考的几个资料,有需要的同学可以看看。另外很多开源库里面都有这两个算法的源码,比如OpenCV,RSGIS,OTB等。
参考资料
[1]:k-means clustering http://en.wikipedia.org/wiki/K-means_clustering
[2]:KMean cluster algorithm http://blog.sina.com.cn/s/blog_51eea616010091ub.html
[3]:K-Mean Clustering Tutorials http://people.revoledu.com/kardi/tutorial/kMean/index.html
[4]:深入浅出K-Means算法 http://www.csdn.net/article/2012-07-03/2807073-k-means
[5]:基本Kmeans算法介绍及其实现 http://blog.csdn.net/qll125596718/article/details/8243404
[6]:A Tutorial on Clustering Algorithms http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/index.html