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

news2024/11/15 13:58:29

在学习遥感的过程中,我们都了解到了监督分类非监督分类,二者是遥感解译的基础。之前更多的是使用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/671416.html

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

相关文章

实施计划:项目成功执行的关键

为了增加成功的机会,特别是当涉及到大型或复杂的项目时,团队可能需要关于项目执行过程的额外指导。实施计划可以用于这一目的。 简而言之,项目实施计划是一份文件,作为项目如何执行的路线图。它规定了项目完成过程中的步骤&#…

<C++> C++11右值引用

C11右值引用 1.左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用…

sonar-scanner-Windows本地Python代码检查使用方法【免费下载sonar-scanner验证有效】

背景介绍: sonar作为开源的代码扫描工具,sonar-scanner是windows扫描器。SonarQube是一个开源的代码质量管理平台,可以将 sonar-scanner扫描的结果进行分析。 公司有搭建SonarQube质量管理平台,支持本地扫描和gitlab集成扫描。现…

locust学习教程(7) - docker运行单个locust脚本

目录 1、安装 docker 2、下载镜像 3、运行脚本 4、开始压测 🎁更多干货 1、安装 docker widnows安装docker客户端blog.csdn.net/weixin_4545… 实施步骤: 第一步、启动docker客户端 2、下载镜像 cmd窗口下载locust镜像文件:docker pul…

隐私链或成监管和虚拟货币犯罪打击新挑战?

匿名币、混币器等是大家在当前案件侦办中常遇到的资金追踪“拦路虎”,而在区块链中还有一些隐私保护方案(隐藏交易相关信息),可能大家较少涉猎,在当前的区块链相关案件中也还没有明显的表现,我们也希望通过…

深度解析:分布式事务解决方案大盘点,助你轻松应对复杂业务场景

随着互联网的发展,分布式系统已经成为了现代软件开发的主流。在分布式系统中,多个节点之间需要协同工作,以完成一些复杂的任务。然而,由于节点之间的网络延迟、故障等问题,这些节点之间可能会出现数据不一致的情况&…

华为OD机试真题 JavaScript 实现【最多获得的短信条数】【2023Q1 100分】,附详细解题思路

一、题目描述 某云短信厂商,为庆祝国庆,推出充值优惠活动。现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。 二、输入描述 第一行客户预算M,其中 0 ≤ M ≤ 10^6第二行给出售价表, P1, P2,…

一切美好如夏而至,中国人民大学与加拿大女王大学金融硕士项目陪你逐梦硕士

流光半夏,美好日长。愿所有春天里的酝酿,都在夏天热烈绽放。你春天酝酿的读研梦有实现吗?在这个最长的白昼,让我们与中国人民大学与加拿大女王大学金融硕士项目邂逅,一起在盛夏里追寻诗与远方。 都说有梦想&#xff0…

【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

目录 1.新建工程前的准备工作(了解)1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7) 2.新建寄存器版本MDK工程步骤(熟悉)2.1新建工程文件夹2.1.1Drivers文件夹2.1.2Middlewares文件夹2.1.3Output文件夹2.1.4Projects文件…

零基础入门网络安全,收藏这篇不迷茫【2022 最新】

前言 最近收到不少关注朋友的私信和留言,大多数都是零基础小友入门网络安全,需要相关资源学习。其实看过的铁粉都知道,之前的文里是有过推荐过的。新来的小友可能不太清楚,这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

ASEMI代理光宝光耦LTV-61L的工作原理与应用探析

编辑-Z 本文将对光耦LTV-61L进行深入的探讨,主要从其工作原理、应用领域、使用注意事项以及市场前景四个方面进行详细的阐述。光耦LTV-61L是一种常用的光电器件,其工作原理简单,应用领域广泛,但在使用过程中也需要注意一些问题。…

1分钟!免费将AI图像创作能力接入办公系统

随着人工智能技术的日新月异,各行各业都在尝试将AI技术融入到自己的生产和服务中以提升效率和用户体验,绘画领域也在迎来一轮新的生产方式革新。在数字绘画领域,AI绘图软件的出现,为数字绘画领域注入了新的活力。 但我们在使用AI绘…

【正点原子STM32连载】第三十八章 CAN通讯实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第三…

VXLAN 主机VTEP(OVN)

EVE环境模拟搭建一个基于主机VTEP的VXLAN数据中心网络。 实验里vtep是在linux主机上,同时linux主机还得有路由功能使VTEP的端点IP可达,所以两台linux服务器需要安装FRR。 数据转发平面使用VXLAN封装;在控制平面我打算选择使用EVPN和OVN两种不…

Golang每日一练(leetDay0101) 最长递增子序列I\II\个数

目录 300. 最长递增子序列 Longest Increasing Subsequence 🌟🌟 2407. 最长递增子序列 II Longest Increasing Subsequence ii 🌟🌟🌟 673. 最长递增子序列的个数 Number of Longest Increasing Subsequence &a…

YOLOv5/v7 添加注意力机制,30多种模块分析⑥,S2-MLPv2模块,NAM模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、S2-MLPv2模块1、 S2-MLPv2模块的原理2、实验结果3、应用示例 三、NAM模块1、NAM 的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本文收录于&a…

【Duilib】资源打包入EXE

环境 VS版本:VS2013 概述 资源打包成ZIP,ZIP文件放置EXE内部。 步骤 1、按上一篇建好工程。 2、RC文件添加ZIP资源。 这一步比较复杂,工程 添加资源,弹窗如下右侧对话框后,按①②③④步骤,找到theme.z…

Springboot项目使用原生Websocket

目录 1.启用Websocket功能2.封装操作websocket session的工具3.保存websocket session的接口4.保存websocket session的类5.定义websocket 端点6.创建定时任务 ping websocket 客户端 1.启用Websocket功能 package com.xxx.robot.config;import org.springframework.context.a…

机器学习实践(1.2)XGBoost回归任务

前言 XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参…

Axure教程—树

本文将教大家如何用AXURE中的动态面板制作树 一、效果 预览地址:https://1rmtjd.axshare.com 二、功能 1、点击“”,展开子节点 2、点击“-”子节点折叠 三、制作 1、父节点制作 拖入一个动态面板,进入,如图: 拖入一…