【 kmeans实现遥感图像分类(matlab实现)】

Author:HanDi
上海某高校遥感专业 工科男
相信积微者速成,相信分享的力量
CSDN@这可真是难为我了

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

从图中不难看出,最后效果图没有经过分类后处理,有很多细小和破碎斑块,使得分类结果的视觉效果不是那么好,大家可以想想如何改进,欢迎交流!

下节预告,理解kmeans原理的基础上,自己编写kmeans函数用于分类

初次写技术博客没有什么经验,如有不足,还请大家多多包涵,欢迎大家私信交流 ^ _ ^ !!!一起进步~
以后会分享一些地理数据处理和数据挖掘的示例

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

这里是原始示例数据
链接:https://pan.baidu.com/s/1_c6vPYuZrQvCMsEoA2STFg?pwd=tmjs
提取码:tmjs

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

代码运行效果

在这里插入图片描述

如有错误,欢迎评论,私信,会及时改正

  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 下面是一份通过 Matlab 实现图像 k-means 分类的代码示例: ``` % 读入图像 I = imread('图像文件.jpg'); % 将图像转换为 2D 矩阵,每一行代表一个像素的 RGB 值 X = reshape(I, size(I,1)*size(I,2), 3); % 设定 k 的值,即分类数 k = 4; % 进行 k-means 分类 [idx, C] = kmeans(X, k); % 将分类结果还原为图像 segmented_images = cell(1,k); for i = 1:k color = C(i,:); color = repmat(color, [size(X,1), 1]); color = reshape(color, [size(I,1), size(I,2), 3]); segmented_images{i} = color; end % 显示分类结果 figure; subplot(2,2,1); imshow(I); title('原图'); subplot(2,2,2); imshow(segmented_images{1}); title('分类 1'); subplot(2,2,3); imshow(segmented_images{2}); title('分类 2'); subplot(2,2,4); imshow(segmented_images{3}); title('分类 3'); ``` 希望这份代码对您有所帮助! ### 回答2: 在Matlab实现图像Kmeans分类的代码如下: ```matlab % 读取图像 image = imread('image.jpg'); % 调整图像大小和颜色空间 image = imresize(image, 0.5); image = im2double(image); % 将图像转换为一维向量 image_vector = reshape(image, [], 3); % 设置Kmeans算法的参数 k = 5; % Kmeans聚类的簇数 max_iterations = 100; % 最大迭代次数 % 利用Kmeans算法对图像进行分类 [cluster_indices, cluster_centers] = kmeans(image_vector, k, 'MaxIter', max_iterations); % 将聚类结果转换为图像 segmented_image_vector = cluster_centers(cluster_indices, :); segmented_image = reshape(segmented_image_vector, size(image, 1), size(image, 2), 3); % 显示原始图像和分割后的图像 figure; subplot(1, 2, 1); imshow(image); title('原始图像'); subplot(1, 2, 2); imshow(segmented_image); title('Kmeans分割后的图像'); % 保存分割后的图像 imwrite(segmented_image, 'segmented_image.jpg'); ``` 上述代码中,首先读取图像并进行大小和颜色空间的调整。然后,将图像转换为一维向量,为后续的Kmeans算法准备数据。接下来,设置Kmeans算法的参数,包括簇数和最大迭代次数。使用`kmeans`函数对图像进行分类,返回每个像素所属的簇索引和每个簇的中心点。然后,将聚类结果转换为图像并显示原始图像和分割后的图像。最后,保存分割后的图像。 需要注意的是,该代码中使用的是RGB颜色空间,如果使用其他颜色空间,需要相应调整代码中的部分内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值