Python GDAL为具有多个波段的大量栅格图像绘制像素随时间变化走势图

  本文介绍基于Python中的gdal模块,对大量长时间序列的栅格遥感影像文件,绘制其每一个波段中、若干随机指定的像元的时间序列曲线图的方法。

  在之前的文章Python中GDAL批量绘制多时相栅格遥感影像的像元时间序列曲线图(https://blog.csdn.net/zhebushibiaoshifu/article/details/128354151)中,我们就已经介绍过基于gdal模块,对大量多时相栅格图像,批量绘制像元时间序列折线图的方法。不过当时文章中的需求,每1个时相都对应着3个不同的遥感影像文件,而每1个遥感影像文件则都仅仅只有1个波段;而在本文中,我们每1景遥感影像都对应着2个波段,我们最终绘制的多条曲线图,也都来自于这每1景遥感影像的不同波段。

  我们再来明确一下本文的需求。现在有一个文件夹,其中放置了大量的遥感影像文件,如下图所示。其中,所有遥感影像都是同一地区、不同成像时间的图像,其各自的空间参考信息、像元行数与列数等都是一致的,文件名中有表示成像日期的具体字段;且每1景遥感影像都具有2个波段。现在我们希望,在遥感影像覆盖的区域内,随机选取若干的像元,基于这些像元,我们绘制其随时间变化的曲线图。因为我们的每个遥感影像都有2个波段,且都希望绘制出曲线图,因此最终的曲线图一共就有2条曲线。

  明确了需求,我们就可以开始代码的撰写。本文用到的代码如下。

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 25 23:04:41 2023@author: fkxxgis
"""import os
import random
import matplotlib.pyplot as plt
from osgeo import gdaldef load_image(image_path):dataset = gdal.Open(image_path)band1 = dataset.GetRasterBand(1).ReadAsArray()band2 = dataset.GetRasterBand(2).ReadAsArray()del datasetreturn band1, band2def plot_time_series(image_folder, pic_folder, num_pixels):image_files = [file for file in os.listdir(image_folder) if file.endswith(".tif")]band1_merge, band2_merge = [], []i = 0for image_file in image_files:image_path = os.path.join(image_folder, image_file)band1, band2 = load_image(image_path)band1_merge.append(band1)band2_merge.append(band2)i += 1x_size, y_size = band1.shapepixel_indices = random.sample(range(x_size * y_size), num_pixels)for pixel_index in pixel_indices:x, y = divmod(pixel_index, y_size)band_list_1, band_list_2 = [], []for i in range(len(band1_merge)):band_data_1 = band1_merge[i]band_list_1.append(band_data_1[x, y])band_data_2 = band2_merge[i]band_list_2.append(band_data_2[x, y])plt.figure()plt.plot(range(len(band1_merge)), band_list_1, label="Band 1")plt.plot(range(len(band1_merge)), band_list_2, label="Band 2")plt.xlabel("Time")plt.ylabel("NDVI")plt.ylim(0, 1000)plt.title(f"Time Series for Pixel at ({x}, {y})")plt.legend()plt.savefig(os.path.join(pic_folder, str(x) + "_" + str(y)))plt.show()image_folder_path = "E:/02_Project/Result/test"
pic_folder_path = "E:/02_Project/TIFF/Plot"
num_pixels = 50
plot_time_series(image_folder_path, pic_folder_path, num_pixels)

  上述代码的具体含义如下。

  首先,我们导入了需要使用的库;其中,os用于处理文件路径和目录操作,random用于随机选择像素,matplotlib.pyplot则用于绘制图像。

  随后,我们定义函数load_image(image_path);这个函数接收一个影像文件路径image_path作为输入参数。随后,在函数内使用gdal库打开该影像文件,然后提取其第一个和第二个波段的数据,并分别存储在band1band2中。最后,函数返回这两个波段的数据。

  接下来,我们定义函数plot_time_series(image_folder, pic_folder, num_pixels);这个函数接收三个输入参数,分别为image_folderpic_foldernum_pixels。其中,image_folder为包含多个.tif格式的影像文件的文件夹路径,pic_folder是保存生成的时间序列图像的文件夹路径,而num_pixels则指定了随机选择的像素数量,用于绘制时间序列图——这个参数设置为几,我们最后就会得到几张结果图像。

  在这个函数的内部,我们通过os.listdir函数获取image_folder中所有以.tif结尾的影像文件,并将这些文件名存储在image_files列表中。然后,我们创建两个空列表band1_mergeband2_merge,用于存储所有影像文件的2个波段数据。接下来,我们遍历所有影像文件,逐个加载每个影像文件的全部波段数据,并将它们添加到对应的列表中。其次,使用random.sample函数从像素索引的范围中随机选择num_pixels个像素的索引,并保存在pixel_indices列表中。接下来,我们遍历并恢复pixel_indices中的每个像素索引,计算该像素在每个影像中的每个波段的时间序列数据,并存储在band_list_1band_list_2列表中。

  随后,我们即可绘制两个时间序列图,分别表示2个波段在不同影像日期上的数值。最后,我们将图像保存到指定的文件夹pic_folder中,命名规则为x_y,其中xy分别代表像素的横、纵坐标。

  执行上述代码,我们即可在指定的文件夹路径下看到我们生成的多张曲线图;如下图所示。

  其中,每1张图像都表示了我们2个波段在这段时间内的数值走势;如下图所示。

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

【LLM】浅析chatglm的sft+p-tuning v2

note GLM将针对不同类型下游任务的预训练目标统一为了自回归填空,结合了混合的注意力机制和新的二维位置编码。本文浅析sft,并基于GLM在广告描述数据集上进行sftp-tuning代码的数据流讲解 文章目录 note零、ChatGLM2模型一、Supervised fine-tuning1. 数…

DNS解析常见问题:如何为网站配置负载均衡?

早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求。随着现在互联网的流量越来越大,系统功能也越来越复杂,单台服务器就算将性能优化得再好,也不足以支撑太大流量…

C#时间轴曲线图形编辑器开发2-核心功能实现

目录 三、关键帧编辑 1、新建Winform工程 (1)界面布局 (2)全局变量 2、关键帧添加和删除 (1)鼠标在曲线上识别 (2)键盘按键按下捕捉 (3)关键帧添加、删…

Unity自定义后处理——用偏导数求图片颜色边缘

大家好,我是阿赵。   继续介绍屏幕后处理效果的做法。这次介绍一下用偏导数求图形边缘的技术。 一、原理介绍 先来看例子吧。   这个例子看起来好像是要给模型描边。之前其实也介绍过很多描边的方法,比如沿着法线方向放大模型,或者用Ndo…

Palo Alto Networks 智能网络安全保护任何地方的用户、应用和数据

Palo Alto Networks 不仅能够为数字企业提供当下所需的网络安全服务,还能为日后的工作打好安全基础,让企业无需在二者间权衡和纠结,这样的网络安全合作伙伴仅此一家。我们承诺将双管齐下,在保障数字企业的安全方面绝不妥协退让。下…

专题-【排序比较】

时间最好:直接和冒泡,n 堆排序和归并时间固定:nlog2n 空间:归并,n;快速,log2n 稳定:直冒归基

Sharding-JDBC分布式事务详解与实战

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

K8s卷存储详解(二)

K8s卷存储详解(二) 持久卷持久卷(PV)持久卷申领(PVC)存储类(StorageClass)存储制备器(Provisioner)PV和PVC的生命周期持久卷的类型CSI 卷快照CSI 卷克隆 投射…

多租户的低代码平台,Saas开发平台:MateCloud

简介 MateCloud是一款基于Spring Cloud Alibaba的微服务架构。目前已经整合Spring Boot 2.7.0、 Spring Cloud 2021、Spring Cloud Alibaba 2021、Spring Security Oauth2、Feign、Dubbo、JetCache、RocketMQ等,支持多租户的低代码平台,Saas平台开发套件…

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题

Kylin 麒麟 Qt软件 QtCreator 中文输入法问题 背景: QtCreator 和程序在麒麟系统下没法进行输入,或没法进行输入法的切换。 包括麒麟自带默认搜狗输入法的切换也不行。 使用下面的命令进行安装后,可以正常在QtCreator和程序中使用输入法。 …

Elasticsearch-增删改查数据工作原理

集群 集群的基本概念: 集群:ES 集群由一个或多个 Elasticsearch 节点组成,每个节点配置相同的 cluster.name 即可加入集群,默认值为 “elasticsearch”。节点:一个 Elasticsearch 服务启动实例就是一个节点&#xff…

【Linux】线程同步条件变量

目录 1 线程同步的引入 2 条件变量&线程同步&竞争条件的概念 3 条件变量相关函数 初始化 销毁 等待条件满足 唤醒等待 4 demo代码——理解条件变量&线程同步 5 为什么 pthread_cond_wait 需要互斥量? 6 条件变量使用规范 1 线程同步的引入 例子生活化&…

【多任务编程-线程通信】

进程/线程通信的方式 某些应用程序中,进程/进程和线程/线程之间不可避免的进行通信,进行消息传递,数据共享等 同一进程的线程之间通信方式包括Windows中常用Event, Message等。 不同进程之间的通信可以利用Event, FileMapping(内存共享), W…

集合--collections

一、collections概述 Collections和Arrays、Objects-一样,都是一种针对性的工具类, Arrays是针对数组,Objects是针对Object, 而Colections则是针对集合的一种工具类,里面提供了大量的方便我们操作集合的方法: //往集合中添加一些元素。 p…

Ajax详细讲解

Ajax(Asynchronous JavaScript And XML)即异步 JavaScript 和 XML,是一组用于在网页上进行异步数据交换的 Web 开发技术,可以在不刷新整个页面的情况下向服务器发起请求并获取数据,然后将数据插入到网页中的某个位置。…

24考研数据结构-栈和队列的应用

目录 3.3.1栈在括号匹配中的应用流程图算法代码 3.3.2栈在表达式求值中的应用1. 中缀表达式 (需要界限符)2. 后缀表达式 (逆波兰表达式)中缀表达式转后缀表达式-手算重点:中缀表达式转后缀表达式-机算重点:后缀表达式的计算—机算 3.前缀表达式 (波兰表达…

杭电oj Simple Set Problem 双指针 尺取法 满注释版

👨‍🏫 题目地址 输入 3 2 1 6 3 -7 7 10 4 9 -5 -9 2 8 5 4 3 3 8 2 10 8 1 -7 3 1 6 10 1 1 9输出 1 15 0使用快读,避免使用 Arrays.fill() 按需初始化 避免卡常 🍑 思路 🍺 AC code import java.io.*; import ja…

机器学习李宏毅学习笔记39

文章目录 前言一、大模型的发展趋势二、KNN LM总结 前言 大模型大资料 大模型的顿悟时刻 一、大模型的发展趋势 随数据量增加,模型可以从量变达到质变,从某一刻开始突然学会东西。 当成为大模型时,分数会从0,0突然变成100,完成“…

【Matplotlib 绘制折线图】

使用 Matplotlib 绘制折线图 在数据可视化中,折线图是一种常见的图表类型,用于展示随着变量的变化,某个指标的趋势或关系。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制折线图。 绘制折线图 下面的代码展示了如何使用 Matplo…

#systemverilog# 说说Systemverilog中《static》那些事儿(内存管理篇2)

一、C语言的内存分配 静态存储:在变量定义时就分配了固定的内存地址与内存大小并一直保持不变,直至整个程序结束;动态存储:由程序控制,运行时才分配内存和地址,且每次分配到的内存和地址不固定C语言主要分为:BSS、Data、Text、Heap(堆)、Stack(栈) 静态内存分配:BS…