Python代码将大量遥感数据的值缩放指定倍数的方法

本文介绍基于Python 中的gdal模块,批量读取大量多波段遥感影像 文件,分别对各波段数据 加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法。

首先,看一下本文的具体需求。我们现有一个文件夹,其中含有大量.tif格式的遥感影像文件;其中,这些遥感影像文件均含有4个波段,每1个波段都表示其各自的反射率 数值。而对于这些遥感影像文件,有的文件其各波段数值已经处于01的区间内(也就是反射率 数据的正常数值区间),而有的文件其各波段数值则是还没有乘上缩放系数 的(在本文中,缩放系数是0.0001)。

例如,如下图所示,即为文件夹中某一景遥感影像。可以看到其各波段数值都是大于1的,这是因为其数值都是还没有乘上缩放系数 的,即是真实的反射率数值10000倍。

我们希望实现的是,对于这些遥感影像中,还没有乘上缩放系数 0.0001的遥感影像,将其像元值乘上这个缩放系数 ;而对于已经缩放过 (也就是像元数值已经落在01区间内)的遥感影像,则不加以任何处理 。最后,将经过上述操作后的所有图像(无论是否执行缩放)均保存至指定的输出结果文件夹中。

本文所需代码如下。

python 复制代码
# -*- 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.RasterXSizedataset.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景遥感影像,可以看到其像素数值已经是乘上缩放系数之后 的了,也就是落在了01的区间内;如下图所示。

至此,大功告成。

相关推荐
2401_83141944几秒前
React 中父子组件函数传递的正确调用方式
jvm·数据库·python
szccyw04 分钟前
如何在XSLT中将动态字段值(如name)安全插入HTML链接的URL参数中
jvm·数据库·python
芝士就是力量啊 ೄ೨4 分钟前
VSCode如何配置Python开发环境
ide·vscode·python
asdzx675 分钟前
告别手动校对:使用 Python 对比两个 PDF 文档的差异
开发语言·python·pdf
qq_460978408 分钟前
如何在 PHP 包含文件中动态排除当前页面的导航项
jvm·数据库·python
编码者卢布10 分钟前
【App Service】查看Application Insights自身SDK日志的方法示例
后端·python·flask
一朵缥缈的向日葵.10 分钟前
[特殊字符] Mojo 语言:为 AI 硬件而生的“Python 升级版” —— 完整指南
人工智能·python·mojo
wolfengi10 分钟前
python之使用docxtpl渲染word模板
数据库·python·word
2401_8314194411 分钟前
Layui如何实现表格内部的图片点击后进入相册轮播模式
jvm·数据库·python
Jetev14 分钟前
SQL使用JOIN连接更新目标表数据_UPDATE语句结合JOIN语法实现
jvm·数据库·python