Python代码将大量遥感数据的值缩放指定倍数的方法
本文介绍基于Python中的gdal
模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法。
首先,看一下本文的具体需求。我们现有一个文件夹,其中含有大量.tif
格式的遥感影像文件;其中,这些遥感影像文件均含有4
个波段,每1
个波段都表示其各自的反射率数值。而对于这些遥感影像文件,有的文件其各波段数值已经处于0
至1
的区间内(也就是反射率数据的正常数值区间),而有的文件其各波段数值则是还没有乘上缩放系数的(在本文中,缩放系数是0.0001
)。
例如,如下图所示,即为文件夹中某一景遥感影像。可以看到其各波段数值都是大于1
的,这是因为其数值都是还没有乘上缩放系数的,即是真实的反射率数值的10000
倍。
我们希望实现的是,对于这些遥感影像中,还没有乘上缩放系数0.0001
的遥感影像,将其像元值乘上这个缩放系数;而对于已经缩放过(也就是像元数值已经落在0
至1
区间内)的遥感影像,则不加以任何处理。最后,将经过上述操作后的所有图像(无论是否执行缩放)均保存至指定的输出结果文件夹中。
本文所需代码如下。
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 18 12:37:22 2024
@author: fkxxgis
"""
import os
from osgeo import gdal
original_folder = r"E:\04_Reconstruction\99_MODIS\new_data\GF_Original"
output_folder = r"E:\04_Reconstruction\99_MODIS\new_data\GF_Rec"
for filename in os.listdir(original_folder):
if filename.endswith('.tif'):
dataset = gdal.Open(os.path.join(original_folder, filename), gdal.GA_ReadOnly)
width = dataset.RasterXSize
height = dataset.RasterYSize
band_count = dataset.RasterCount
driver = gdal.GetDriverByName('GTiff')
output_dataset = driver.Create(os.path.join(output_folder, "New_" + filename), width, height, band_count, gdal.GDT_Float32)
for band_index in range(1, band_count + 1):
band = dataset.GetRasterBand(band_index)
data = band.ReadAsArray()
if band_index == 1:
data = data.astype(float)
data[data > 1] /= 10000
elif band_index == 2:
data = data.astype(float)
data[data > 1] /= 10000
elif band_index == 3:
data = data.astype(float)
data[data > 1] /= 10000
elif band_index == 4:
data = data.astype(float)
data[data > 1] /= 10000
output_band = output_dataset.GetRasterBand(band_index)
output_band.WriteArray(data)
output_band.FlushCache()
output_dataset.SetGeoTransform(dataset.GetGeoTransform())
output_dataset.SetProjection(dataset.GetProjection())
dataset = None
output_dataset = None
首先,我们使用os.listdir()
函数遍历原始数据文件夹中的所有文件,并使用if
语句筛选出以.tif
结尾的文件;随后,使用gdal.Open()
函数打开原始影像数据集,并指定只读模式;接下来,使用dataset.RasterXSize
和dataset.RasterYSize
获取影像数据集的宽度和高度。
随后,使用dataset.RasterCount
获取波段数量,并使用gdal.GetDriverByName()
创建输出数据集的驱动程序对象;紧接着,通过Create()
方法创建输出数据集,并指定输出文件的路径、宽度、高度、波段数量和数据类型(gdal.GDT_Float32
表示浮点型)。
接下来,就可以开始使用循环,对每个文件的每个波段进行处理。首先,使用dataset.GetRasterBand()
方法获取当前波段对象,然后使用band.ReadAsArray()
将波段数据读取为数组;根据波段索引的不同,对波段数据进行处理。在本文中,对4
个波段进行的其实是相同的处理,即将大于1
的像素值除以10000
。
其次,使用output_dataset.GetRasterBand()
方法获取输出数据集中的当前波段对象,并使用output_band.WriteArray()
方法将处理后的数据写入输出数据集。
再次,使用dataset.GetGeoTransform()
和dataset.GetProjection()
分别获取原始数据集的地理转换和投影信息,并使用output_dataset.SetGeoTransform()
和output_dataset.SetProjection()
设置输出数据集的地理转换和投影信息。
最后一步,关闭数据集对象。至此,代码就完成了对每个.tif
文件的处理,并将处理后的数据保存到输出文件夹中。
此时,打开本文开头展示的那1
景遥感影像,可以看到其像素数值已经是乘上缩放系数之后的了,也就是落在了0
至1
的区间内;如下图所示。
至此,大功告成。
Python代码将大量遥感数据的值缩放指定倍数的方法的更多相关文章
- python代码块,小数据池,驻留机制深入剖析
一,什么是代码块. 根据官网提示我们可以获知: 根据提示我们从官方文档找到了这样的说法: A Python program is constructed from code blocks. A blo ...
- python代码块和小数据池
id和is 在介绍代码块之前,先介绍两个方法:id和is,来看一段代码 # name = "Rose" # name1 = "Rose" # print(id( ...
- OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式
以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...
- 关于千里马招标网知道创宇反爬虫521状态码的解决方案(python代码模拟js生成cookie _clearence值)
一.问题发现 近期我在做代理池的时候,发现了一种以前没有见过的反爬虫机制.当我用常规的requests.get(url)方法对目标网页进行爬取时,其返回的状态码(status_code)为521,这是 ...
- 【Python代码】TSNE高维数据降维可视化工具 + python实现
目录 1.概述 1.1 什么是TSNE 1.2 TSNE原理 1.2.1入门的原理介绍 1.2.2进阶的原理介绍 1.2.2.1 高维距离表示 1.2.2.2 低维相似度表示 1.2.2.3 惩罚函数 ...
- 用不到 50 行的 Python 代码构建最小的区块链
引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...
- Python基础学习Day6 is id == 区别,代码块,小数据池 ---->>编码
一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...
- 5 种使用 Python 代码轻松实现数据可视化的方法
数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使 ...
- Python代码块缓存、小数据池
引子 前几天遇到了这样一道Python题目:a='123',b='123',下列哪个是正确的? A. a != b B. a is b C. a==123 D. a + b =246 正确答案是B 是 ...
- [转]5 种使用 Python 代码轻松实现数据可视化的方法
数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使 ...
随机推荐
- .NET9 - 新功能体验(二)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化. 01.新的泛型约束 allows ref struct 这是在 C# 13 中,引入的一项新的泛型约束功能,允许对泛型类型参数应用 ref ...
- luasql报错笔记
luasql 编译安装 查看mysql配置,注意 lmysqlclient 路径 [root@hmy luasql-master]# yum install mysql-devel gcc* -y [ ...
- Spring的IOC容器创建过程深入剖析
前言 本次对于Spring的IOC容器的创建过程是基于其源码进行研究分析的,主要涉及BeanFactory的创建过程,Bean的解析与注册过程,Bean实例化的过程以及诸如ClassPathXmlAp ...
- mysql与mongodb、redis的性能对比,包含源代码
最近因为工作需要,所以研究了一下mongodb,但是不知道它的真实性能怎么样,所以对比mysql做了一些测试,现在只是插入操作,更新还没来得及弄,贴出来和大家分享一下(已经补齐redis部分) 1.数 ...
- PHP之环境搭建(php7.4 + php8.1)
之前写过几次,使用lnmp,宝塔,源码编译等方式来进行PHP环境的搭建, 随着接触的越来越多, 这里做一个总结, 常用的搭建方式 1.编译安装 之前写个几次,可以参考之前的 这次记录下多个版本PHP的 ...
- spring 使用异步任务
1.说明 在springboot 中使用 @Async 实现异步任务处理,下面介绍一下如何实现这个. 2.实现代码 2.1 增加@EnableAsync @EnableAsync public cla ...
- http请求超时, 底层发生了什么?
业务方反应调用接口超时,但是在服务端监控并没有看到5xx异常, 于是我们模拟一下请求超时时发生了什么? 1.openresty模拟长耗时服务端 延迟5s响应 error_log logs/error. ...
- [原创] Realtek RTL8195A WIFI历史漏洞分析和新漏洞挖掘
前言 本文主要分析vdoo发现的一些RTL8195A WIFI模块的漏洞. 环境搭建 下载最新的SDK https://github.com/ambiot/amb1_arduino/blob/mast ...
- 【杂谈】如何选择:Session 还是 JWT?
服务端如何验证客户端已经登录? 在用户成功登录后,服务端会发放一个凭证.之后,客户端的每次请求都需要携带该凭证,服务端通过验证凭证的有效性来判断用户是否已登录,并处理请求. 以下是 Session 和 ...
- 关于Git上传项目报错error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
问题 今天用Git上传项目时,最后一步push时命令行报错 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: ...