Author:HanDi

数据挖掘课上一个小实验,用matlab自带的kmeans函数实现遥感图像分类,代码总体简单整洁,注释详细,可轻松修改自用,但是我觉得自己选的分类结果颜色是丑了点,大家可以通过修改colormap自定义颜色,包括colorbar。

从图中不难看出,最后效果图没有经过分类后处理,有很多细小和破碎斑块,使得分类结果的视觉效果不是那么好

下面是完整代码,我的MATLAB版本是 2021a

clc
clear
tic
[A,R] = readgeoraster('test2014.tif'); %打开tiff文件
[lines,rows,bands] = size(A); %读取遥感图像的结构
data = []; %存储数据,n*p维,n表示样本数,p表示特征,这里特征为7,每个像元都有7个波段
for i = 1:bands %循环读取每个波段
    data = [data reshape(A(:,:,i),lines*rows,1)]; %对波段降维
end
data = double(data); %转为双精度浮点,便于kmeans函数计算
band1 = A(:,:,1); %这三句只是为了读取波段,观察上述过程改变矩阵维度是否正确
band2 = A(:,:,2);
band3 = A(:,:,3);
%使用kmeans算法聚类,Idx是聚类后的结果,C为质心位置,
%sumD为该类所有点与质心的距离之和,D为该类的点与质心的距离
%采用欧氏距离作为距离评判标准,一共分为6类,迭代3次,rep = Replicates 即重复聚类次数(可以理解为重复程序多次取平均)
[Idx,C,sumD,D] = kmeans(data,6,'dist','sqEuclidean','rep',3); 
%Idx为m个整数,且属于1到K之间的数;sumD为1*K的和向量,存储的是类内所有点与该类质心点距离之和;
result = reshape(Idx,lines,rows); %把样本对应的土地利用编号对应到遥感图像上
imagesc(result); %显示聚类结果
title('聚类结果');
%tabulate 是Frequency table函数,显示向量中存在的数及其占比
tabulate(Idx(:)) %显示各类别的像元总数及所占的百分比
hAxes = gca;
colormap(hAxes , [207/255 165/255 35/255; 170/255 251/255 164/255; 1 1 1;73/255 157/255 250/255; 1 0 0; 32/255 121/255 63/255] )
c = colorbar;
c.ticks = [1,2,3,4,5,6];
toc

代码运行效果

遥感图像语义分割代码 遥感图像分类代码_聚类