Matlab多光谱kmeans聚类分割

参考代码:https://blog.csdn.net/ma7856728/article/details/84891530
https://blog.csdn.net/qq_37970770/article/details/105606207


入驻csdn的小白 希望和大家一起学习进步 流水账似的有点凌乱 思绪还是稳得昂嘻嘻


上篇写到ENVI软件的分割工具出现错分的情况,按照之前所说的matlab设定阈值提取得到的图像没有地理意义,需要进行配准,并且只能得到每类的二值图,根据分类建立ROIs,提取值到点,总是提取到角点,不能得到像元值,如下图,而且arcgis和envi软件同时使用会遇到存储格式转换的问题,甚至在txt转excel时1600行就能拖卡电脑。
因此决定暂时不考虑envi、arcgis等软件,只用matlab进行处理。

笔者处理的影像为多光谱影像,matlab自带的kmeans函数可以处理多维数据,但每一维都要写成列向量的形式,通过查阅大家自己编写的函数以及不同的误差处理方式,了解到matlab自带的kmeans算法更优。

clc
clear
close all
I = imread('SPOT5多光谱.tif');
[M,N,L] = size(I);
%构造样本空间
A = reshape(I(:, :, 1), M*N, 1);    % 将RGB分量各转为kmeans使用的数据格式n行,一样一样本
B = reshape(I(:, :, 2), M*N, 1);
C = reshape(I(:, :, 3), M*N, 1);
D = reshape(I(:, :, 4), M*N, 1);
K = 4;
dat = [A B C D];  % 四个分量组成样本的特征,每个样本有4个属性值,共width*height个样本
c3 = kmeans(double(dat), K);    % 使用聚类算法分为K类
r3 = reshape(c3, M, N);     % 反向转化为图片形式
figure, imshow(label2rgb(r3))   % 显示分割结果
title('matlab库函数');

笔者的目的是分割每一类,因此编写了如下代码将结果导出

index = find(c3 == 1)%第i类
temp1 = I(:,:,1)%第1个波段
temp2 = I(:,:,2)%第2个波段
temp3 = I(:,:,3)%第3个波段
temp4 = I(:,:,4)%第4个波段b1= temp1(index)
b2= temp2(index)
b3= temp3(index)
b4= temp4(index)class1=[b1,b2,b3,b4];
xlswrite('class1.xls',class1);

为了方便后续研究的计算,需要修改代码,赋予地理坐标。

data=imread('D:\DDDDDDDDESK\异质性分析\样地100.tif');%读取纯数据[multi_data,r]=geotiffread('D:\DDDDDDDDESK\异质性分析\样地100.tif');  % read the geo informationinfo=geotiffinfo('D:\DDDDDDDDESK\异质性分析\样地100.tif');   % read the geo information[fl,s,b] = size(data);dat = zeros(fl*s,b);%matlab K-means算法要求输入矩阵是一个列向量组成的矩阵,列数为波段数,每一列为fl*s的像元值for i=1:bdat(:,i) = reshape(data(:,:,i),fl*s,1);endclass_result = kmeans(dat,5);out_data = reshape(class_result,fl,s);
figure, imshow(label2rgb(out_data))  % 显示聚类结果geotiffwrite('geo_outimage.tif',out_data,r,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);index = find(class_result == 1)%第i类
temp1 = data(:,:,1)%第1个波段
temp2 = data(:,:,2)%第2个波段
temp3 = data(:,:,3)%第3个波段
temp4 = data(:,:,4)%第4个波段b1= temp1(index)
b2= temp2(index)
b3= temp3(index)
b4= temp4(index)[m,n]=find(class_result == 1)  %寻找每类像元,得到m*1的矩阵
m1=fix(m/fl)+1; n1=rem(m,fl)+1;  %根据线性顺序转变为行列号
[a1,a2] = pix2map(info.RefMatrix,1,1)%左上角像素大地坐标
pixelscale=8; %输入单个像元大小
x=a1+pixelscale*(n1-1);%计算大地坐标
y=a2-pixelscale*(m1-1);
location=[x,y]; %double和uint8格式的数据存在不同的sheet中
class1=[b1,b2,b3,b4,b5];
xlswrite('100-class1.xls',class1,'Sheet1');
xlswrite('100-class1.xls',location,'Sheet2');

得到对应像元每个波段值和大地坐标,分别存储在同一表格的不同sheet下,随后进行每一类的抽样、变异函数分析、克里金插值等。
对变异函数分析后的样地进行比较range值与样地大小,某些情况需要分区进行kmeans处理,只需要改变初始左上角坐标和for循环中的像元个数即可。

得到的结果很明显有农田的规则格网状,统计分类结果如下:

Matlab多光谱kmeans聚类分割相关推荐

  1. Matlab实现K-Means聚类算法

    原文地址为: Matlab实现K-Means聚类算法 人生如戏!!!! 一.理论准备 聚类算法,不是分类算法.分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类.聚类算法是给一大堆原始 ...

  2. 【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法

    matlab实现Kmeans聚类算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab实现Kmeans聚类 ...

  3. matlab中kmeans聚类算法

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xholes/article/details/52911781 </div><lin ...

  4. k-means聚类分割

    算法的思想是初始选取M个种子点,将周围点的特征和种子点特征进行距离的测定,距离最小的点和该种子点归为一类.则可以分为M个类别,计算这些类别特征的质心作为新的种子点,再次分类,如此迭代n次后的结果便是聚 ...

  5. 基于MATLAB的K-means聚类算法

    实验数据说明 Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集.通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa(山鸢尾),Versicolour(杂色鸢尾),V ...

  6. matlab实现Kmeans聚类

    K-means聚类的建模与求解 1.建模前准备 建模前,我们小组通过阅读文献,研究讨论了K-means的实现原理和应用场景,认为K-means算法在求解用户出行分区信息上具有可行性. 2.模型建立 通 ...

  7. 使用MATLAB进行K-means聚类和层次聚类

    1.分别使用k-means聚类和层次聚类,将以下八个点分为3个类簇.A1=(2,10),A2=(2,5),A3=(8,4),A4=(5,8),A5=(7,5), A6=(6,4), A7=(1,2), ...

  8. 基于MATLAB的Kmeans聚类算法的仿真与分析

    目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 K-means聚类算法是硬聚类算法,是典型的基于原型的目标函数聚类分析算法点到原型--簇中心的某种距离和作为优化的目标函数,采用函数求极值 ...

  9. matlab 实现 kmeans聚类,gscatter的应用

    load fisheriris X = meas(:,3:4);figure; plot(X(:,1),X(:,2),'k*','MarkerSize',5); title 'Fisher''s Ir ...

  10. [Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. 数组--存储地址的计算
  2. python发挥程度_你为什么用 Python?
  3. 数据交换格式Json与XML
  4. python数字从大到小排列_Python练习题 005:三个数字由大到小排序输出
  5. java处理请求的流程_Java Spring mvc请求处理流程详解
  6. C语言小知识---printf()函数转换符的意义
  7. python接口自动化21-下载excel文件(Content-Type:octets/stream)
  8. matlab拟合分析画不出线,lsqcurvefit曲线拟合后,用polt函数画不出拟合的图形
  9. WIN31DOSBox中魔改PWIN32 - 温故、浸馨、继而知新
  10. 闪存flash基础原理
  11. mysql存小程序获取到的带有表情的昵称_拉取用户信息,带表情的昵称,存储到数据库是???要怎么处理...
  12. 《虎胆龙威5》效果评论
  13. TestNG 参数化测试
  14. 【U8】U8V12.5新增部门档案,保存提示:系统忙,稍后再试!
  15. POJ 3290 WFF 'N PROOF 英文少
  16. 团队项目开发“编码规范”之九:代码分析
  17. 测开基础串讲-Java基础-测开常用API之Random类
  18. SUMPRODUCT函数使用方法及示例
  19. autoJS for 快手极速版 可运行
  20. 实时摄像头直播方案 RTSP

热门文章

  1. (day 50 - 动态规划+概率论 ) 剑指 Offer 60. n个骰子的点数
  2. (秒杀项目) 4.2 用户登录和注册
  3. 阿里云 centos 7.6 安装和启动redis 6
  4. can接收id过滤linux,linux – 很大程度上被candump(SocketCAN)ID过滤功能搞糊涂了
  5. linux拨号日志,Linux系统日志管理:(1)连接时间日志
  6. java聚集_深入理解JAVA中的聚集和组合的区别与联系
  7. Java编程:中缀表达式转后缀表达式
  8. Cesium:实现漫游飞行
  9. Javascript:面向对象举例——矩形类及其实例化
  10. Pannellum:实例之在部分视角内展示全景图