【机器学习与遥感】sklearn与rasterio实现遥感影像非监督分类

news2024/10/5 0:38:12

在学习遥感的过程中,我们都了解到了监督分类非监督分类,二者是遥感解译的基础。之前更多的是使用Erdas与ENVI来进行这两种分类。这里使用python语言,基于机器学习库sklearn与遥感影像处理库rasterio,使用kmeans动态聚类方法实现非监督分类。

非监督分类

非监督分类是以不同影像地物在特征空间中类别特征的差别为依据的一种无先验(已知)类别标准的图像分类,是以集群为理论基础,通过计算机对图像进行集聚统计分析的方法。根据待分类样本特征参数的统计特征,建立决策规则来进行分类。而不需事先知道类别特征。把各样本的空间分布按其相似性分割或合并成一群集,每一群集代表的地物类别,需经实地调查或与已知类型的地物加以比较才能确定。有监督必须有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律;非监督没有训练集,只有一组数据,在该组数据集内寻找规律。

sklearn

Scikit-learn(以前称为scikits.learn,也称为sklearn)是针对Python 编程语言的免费软件机器学习库 。它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度提升,k均值和DBSCAN,并且旨在与Python数值科学库NumPy和SciPy联合使用。

rasterio

rasterio是一个操作栅格影像的python库,它是在GDALPyproj等库的基础上封装而来, 它的函数通常接受并返回 Numpy ndarrays。 Rasterio 旨在使处理地理空间栅格数据更高效、更有趣。它也可以直接进行影像的读写,包括弹窗渲染显示影像。

K-Means

K-Means 是发现给定数据集的 K 个簇的聚类算法, 之所以称之为 K-均值 是因为它可以发现 K 个不同的簇, 且每个簇的中心采用簇中所含值的均值计算而成。

优点

  • 容易理解,聚类效果不错,虽然是局部最优, 但往往局部最优就够了;
  • 处理大数据集的时候,该算法可以保证较好的伸缩性;
  • 当簇近似高斯分布的时候,效果非常不错;
  • 算法复杂度低。

缺点

  • K 值需要人为设定,不同 K 值得到的结果不一样;
  • 对初始的簇中心敏感,不同选取方式会得到不同结果;
  • 对异常值敏感;
  • 样本只能归为一类,不适合多分类任务;
  • 不适合太离散的分类、样本类别不平衡的分类、非凸形状的分类。

代码实现过程

1. 依赖

import rasterio as rio
from rasterio.plot import show
from sklearn import cluster
import matplotlib.pyplot as plt
import numpy as np
import os
# 处理pyproj安装冲突问题,注意替换为自己的路径
os.environ['PROJ_LIB'] = r'C:\Users\bo\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyproj\proj_dir\share\proj'

需要注意的是os.environ['PROJ_LIB']是用来防止本地pyproj路径冲突的,如果本地无冲突的话,也可以不写。

2.读取原始影像数据

    rs = rio.open(r'E:\测试数据\无人机影像\0926_01.tif')
    rs_data = rs.read()
    vmin, vmax = np.nanpercentile(rs_data, (2, 98))

numpy.nanpercentile(arr, q, axis=None, out=None)

  • arr : 输入阵列。
  • q : 百分数值。
  • axis:我们要计算百分位数的轴。否则,它将认为arr是平坦的(在所有轴上工作)。 axis=0意味着沿着列, axis=1意味着沿着行工作。
  • out :不同的数组,我们要把结果放在其中。该数组必须具有与预期输出相同的尺寸。

3.数组纬度转换

多波段影像读取出来的数组格式,与聚类分析所使用的格式不一致,需要进行转置。

    # 波段放在了最后一个维度,多维矩阵转置
    rs_data_trans = rs_data.transpose(1, 2, 0)
    print(rs_data.shape, rs_data_trans.shape)
    # 然后直接把矩阵reshape成机器学习中常用的表格形状,将矩阵a变成列数为x,行数不规定的矩阵,具体行数按照总元素个数除列数,均分得到。
    # 3维转2维
    rs_data_1d = rs_data_trans.reshape(-1, rs_data_trans.shape[2])
    print(rs_data_1d.shape)
  • 使用 numpy.transpose ()进行变换,其实就是交换了坐标轴,如:x.transpose(1, 2, 0),其实就是将x第二维度挪到第一维上,第三维移到第二维上,原本的第一维移动到第三维上,最后的shape为:(3,2,2)

  • a.reshape(-1, x)则是将矩阵a变成列数为x,行数不规定的矩阵,具体行数按照总元素个数除列数,均分得到。

4.建立模型,进行训练

    # 建立模型
    # n_clusters:分类簇的数量。
    cl = cluster.KMeans(n_clusters=5, n_init='auto')  # create an object of the classifier
    param = cl.fit(rs_data_1d)  #

KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm='auto')

  • n_clusters:分类簇的数量。

  • init:接收待定的string。kmeans++表示该初始化策略选择的初始均值向量之间都距离比较远,它的效果较好;random表示从数据中随机选择K个样本最为初始均值向量;或者提供一个数组,数组的形状为(n_cluster,n_features),该数组作为初始均值向量。

  • n_init:用不同的聚类中心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果;默认值为10。

  • max_iter:最大的迭代次数。

  • tol:表示算法收敛的阈值。

  • precompute_distance:接收Boolean或者auto。表示是否提前计算好样本之间的距离,auto表示如果nsamples*n>12 million,则不提前计算。

  • verbose:0表示不输出日志信息;1表示每隔一段时间打印一次日志信息。如果大于1,打印次数频繁。

  • random_state:表示随机数生成器的种子。

  • n_jobs:表示任务使用CPU数量;若值为 -1,则用所有的CPU进行运算。

5. 提取计算结果

提取计算结果,并将多维数组的转置还原

    # 还原数据
    img_cl = cl.labels_
    img_cl = img_cl.reshape(rs_data_trans[:, :, 0].shape)

6. 保存分类结果数据

将监督分类后的影像保存本地

    prof = rs.profile
    # 更新为1个波段
    prof.update(count=1)
    with rio.open(r'E:\测试数据\无人机影像\0926_01result.tif', 'w', **prof) as dst:
        dst.write(img_cl, 1)

7.结果对别展示

    fig, (ax1, ax2) = plt.subplots(figsize=[15, 15], nrows=1, ncols=2)
    show(rs, cmap='gray', vmin=vmin, vmax=vmax, ax=ax1)
    show(img_cl,cmap='gray', ax=ax2)
    ax1.set_axis_off()
    ax2.set_axis_off()
    fig.savefig("pred.png", bbox_inches='tight')
    plt.show()

对比效果图如下所示:可能我这块准备的影像不太适合

对比图片

整体流程总结

Created with Raphaël 2.3.0 读取影像 多维数组转置 聚类分析 分析结果提取 结果转置 结果保存为文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PP-Structure—表格数据提取

目录 简介 特性 效果展示 表格识别 版面分析和表格识别 版面恢复 关键信息抽取 快速开始 1. 准备环境 1.1 安装PaddlePaddle 1.2 安装PaddleOCR whl包 2 快速使用 3. 便捷使用 3.1 命令行使用 3.2 Python脚本使用 3.3 返回结果说明 分析总结 简介 PP-Stru…

Python 装饰器

一、什么是装饰器 装饰器本质上就是一个Python函数,它可以装饰在其他函数上,使得其他函数不需要做任何改动就可以获得装饰器函数中的功能。实际上被装饰器修饰的函数在执行的时候不会直接运行其函数内部的逻辑,而是先将这个函数当作参数传递…

【企业架构治理】SOGAF ,Salesforce 的运营、治理和架构框架

“如果你想要新的东西,你必须停止做旧的东西。”——彼得德鲁克,《公司概念》的作者 这篇文章介绍了 Salesforce 运营、治理和架构框架 (SOGAF),这是一个新的大规模治理框架,由对跨多个行业的学术文献、现有框架和转型案例研究的广…

如何对数据库进行垂直拆分或水平拆分?

水平拆分的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一 样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。水平拆分的意 义,就是将数据均匀放更多的库里&#xff0…

高性能计算培训机构哪些好?培训机构排行推荐!

目前市面上高性能计算培训不多,尤其是专业做高性能计算培训的机构更是不多。 比较好的高性能计算培训有北大未名超算队、各类超算中心的高性能计算培训视频、以及猿代码科技的系统实战化的高性能计算培训课程,这些在B站上均有不错的播放量,群…

【Go语言从入门到精通系列-基础篇】Go语言变量、常量和运算符:完全指南

系列文章目录 【Go语言从入门到精通系列-基础篇】Go安装 语言特性,以及开启你人生中的第一个go程序 【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。 Go语言从入门到精通系列-基础篇 系列文章目录前言一、变量和常量的基本概念1. 变量1.1 变…

赶赴一场夏日盛宴丨千岛湖夏季团建旅行攻略

千岛湖的秀丽景色让人惊艳,也是江浙沪地区热门的团建目的地之一; 千岛湖 千岛湖团建元素:【千岛湖风景区】【山顶观景台】【皮划艇】【环湖骑行】【卡丁车】【高空闯关】【篝火晚会】【湖畔烧烤】【高空跳伞】 【千岛湖山顶观景台】 站在湖畔…

如何用快改图工具指定压缩图片大小

我们在遇到好看的图片或自己拍的照片,都会对其进行一些处理,处理完成后将其保存,保存时发现自己要存的图片太多了,比较占内容。这种情况就需要压缩。那么,在压缩图片时,怎么压缩图片到指定大小呢&#xff1…

【ES三周年】| 基于国产化操作系统搭建ELK日志分析平台

引入 鲲鹏认证-Kylin麒麟操作系统-ELK日志分析平台 开篇 何为ELK Stack?它又能够给我们带来什么? 综述 ELK为三个开源项目的首字母缩写,分别对应是:Elasticsearch、Logstash、Kibana,由这三个软件及其相关的组件可…

threejs 入门 (vite + vue3)

threejs threejs用于实现3D效果 vite创建vuejs项目 npm create vite选择vue 和js创建vue3项目 安装threejs npm install three运行项目 cd project npm i npm run dev修改App.vue 创建一个场景和立方体&#xff08;Creating a scene&#xff09; <script setup> …

labview 波形图表(waveform Chart)

波形图表&#xff08;waveform Chart&#xff09;是显示一条或多条曲线的特殊数值控件&#xff0c; 一般用于显示以恒定速率采集的数据。 波形图表会在缓冲区保留历史数据并在历史数据后添加新数据。 波形图表的默认数据缓冲区大小为1024个数据点。 &#xff08;右击波形图…

BurpSuite使用教程·代理抓包篇

BurpSuite使用教程代理抓包篇 1.Burp Suite代理和浏览器设置2.数据拦截与控制3.可选项配置4.Proxy监听设置1.Burp Suite代理和浏览器设置 Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦截h…

Mybatis源码分析_事务管理器 (5)

今天我们首先学习2个设计模式。工厂设计模式 和 模板设计模式 工厂方法模式&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类实例化延迟到子类。 上图的图很清晰&#xff1a;业务接口有很多实现类&#xff0c;而工厂接口也有还…

保姆级自动化测试教程(Selenium+java)

文章目录 自动化测试1. 自动化测试介绍2. Selenium介绍与环境搭建2.1 介绍2.2 Selenium原理2.3 SeleniumJava环境搭建 3. webdriver API3.1 元素的定位3.2 操作测试对象3.3 添加等待3.4 打印信息3.5 浏览器操作3.6 键盘事件3.7 鼠标事件3.9 特殊使用3.10 浏览器关闭3.11 切换窗…

让你不再好奇ai绘画生成器有哪些

绘画爱好者李明最近遇到了一个难题&#xff1a;他需要在短时间内完成一幅复杂的数字油画作品&#xff0c;但是他的手绘技能仍然不够熟练。于是&#xff0c;他想到了借助一些ai绘画软件来帮助他进行绘画创作。那么&#xff0c;你知道ai智能绘画软件有哪些吗&#xff1f;接下来我…

Vue中使用ElementUItable表格显示图片问题

1.问题 说明&#xff1a;table表格显示不了图片问题 品牌logo中显示的是url地址&#xff0c;因此我们要使用作用域插槽。 <template slot scope"{row,$index}"> </template> 说明&#xff1a;使用Vue的插槽功能&#xff0c;允许在当前列的内容上添加…

git暂存功能(只需要两步)

使用场景 我在写一个功能的时候发现一个bug&#xff0c;但是这个bug在我上一次提交的时候好像是没有的&#xff0c;所有我需要把当前的代码暂存,然后查看上一次提交是否正常。 一、暂存 暂存当前所有的修改 git stash二、恢复 恢复最近一次暂存&#xff0c;并把暂存删掉 …

获阿布扎比政府11亿美元投资将使蔚来改变电动汽车行业游戏规则?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结 &#xff08;1&#xff09;6月20日&#xff0c;蔚来宣布与阿布扎比政府控股的投资公司CYVN Holdings签订了股份认购协议&#xff0c;蔚来将获得CYVN Holdings11亿美元的战略投资&#xff0c;这可能会导致蔚来在阿布扎…

从零开始 Spring Boot 50:Entity Lifecyle Event

从零开始 Spring Boot 50&#xff1a;Entity Lifecyle Event 图源&#xff1a;简书 (jianshu.com) 在上篇文章&#xff0c;我介绍了 Hibernate 中的实体生命周期以及可以转换实体状态的 Session API。就像 Spring Bean 的生命周期拥有一些事件&#xff0c;通过监听这些事件我们…

C# 中【委托】的简单理解

先不说 C# 中的委托编程&#xff0c;先从生活中的例子入手。 场景一&#xff1a; 防疫期间&#xff0c;外卖人员不能进入花园小区。外卖小哥到了花园小区门口&#xff0c;只好【委托】花园的保安人员&#xff0c;把东西送上楼去。 场景二&#xff1a; 有资格的人&#xff0c;都…