1、K-means简介
k-means是一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中,它是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。经过反复迭代,直到聚类中心变化极小,输出最终的聚类结果。
本文是对图像进行进行聚类,事先通过GDAL读取图像的数据,如何进行k-means迭代并保存为新图像。话不多说,直接上代码。
2、K-means实现过程
2.1 获取Dataset数据
public static List<int[]> GetDNdata(Dataset dataset)//将各像元DN数据存入数组方便计算
{
int xSize = dataset.RasterXSize;
int ySize = dataset.RasterYSize;
List<int[]> idata = new List<int[]>();
for (int i = 0; i < dataset.RasterCount; i++)
{
int[] bf = new int[xSize * ySize];
dataset.GetRasterBand(i + 1).ReadRaster(0, 0, xSize, ySize, bf, xSize, ySize, 0, 0);
idata.Add(bf);
}
return idata;
}
2.2 k-means静态函数
/// <summary>
/// K均值聚类(K-means)
/// </summary>
/// <param name="dt">原图数据集</param>
/// <param name="threshold">迭代阈值</param>
/// <param name="K">聚类数量</param>
/// <param name="filepath">保存路径</par