首页 > 编程语言 >批量计算遥感影像NDVI:Python代码

批量计算遥感影像NDVI:Python代码

时间:2024-11-09 15:58:09浏览次数:4  
标签:Python dataset band 遥感 output NDVI data 影像

  本文介绍基于Python中的gdal模块,批量基于大量多波段遥感影像文件,计算其每1景图像各自的NDVI数值,并将多景结果依次保存为栅格文件的方法。

  如下图所示,现在有大量.tif格式的遥感影像文件,其中均含有红光波段近红外波段(此外也可以含有其他光谱波段,有没有都不影响);我们希望,批量计算其每1景遥感影像的NDVI

image

  在之前的文章中,我们多次介绍过在不同软件或平台中计算NDVI的方法;而在本文中,我们就介绍一下基于Python中的gdal模块,实现NDVI批量计算的方法。

  这里所需的代码如下。

# -*- 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\2021_48STA_Result\Original"
output_folder = r"E:\04_Reconstruction\99_MODIS\new_data\2021_48STA_Result\NDVI_Original"

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
        
        driver = gdal.GetDriverByName('GTiff')
        output_dataset = driver.Create(os.path.join(output_folder, "NDVI_" + filename), width, height, 1, gdal.GDT_Float32)
        
        band_red = dataset.GetRasterBand(3)
        data_red = band_red.ReadAsArray()
        data_red = data_red.astype(float)
        band_nir = dataset.GetRasterBand(4)
        data_nir = band_nir.ReadAsArray()
        data_nir = data_nir.astype(float)
        data_ndvi = (data_nir - data_red) / (data_nir + data_red)

        output_band = output_dataset.GetRasterBand(1)
        output_band.WriteArray(data_ndvi)
        output_band.FlushCache()
        output_dataset.SetGeoTransform(dataset.GetGeoTransform())
        output_dataset.SetProjection(dataset.GetProjection())

        dataset = None
        output_dataset = None
        print(filename, "finished!")

  代码整体也非常简单。首先,我们定义输入文件与输入结果文件的路径,前者就是待计算NDVI的遥感影像文件路径,后者则是NDVI结果的遥感影像文件路径。

  接下来,遍历original_folder文件夹中的文件。其中,os.listdir()用于获取文件夹中的文件列表,其后的endswith('.tif')用于筛选出以.tif扩展名结尾的文件。

  随后,对于每个以.tif结尾的文件,首先使用gdal.Open()打开文件——其中的os.path.join()用于构建完整的文件路径;接下来获取影像数据集的宽度和高度,并使用gdal.GetDriverByName()获取GTiff驱动程序,用于创建输出影像文件;同时,使用driver.Create()创建一个与原始影像具有相同大小的输出影像文件。

  紧接着,从数据集中获取红光近红外波段的数据。dataset.GetRasterBand()用以获取指定的栅格波段,而band.ReadAsArray()则将波段数据读取为数组;同时,我这里还用了astype()转换数组的格式,避免原本遥感影像的数据格式带来的问题——例如,假如原本遥感影像是无符号整型的数据格式,那么这里不加astype()计算NDVI就会有问题。

  其次,即可计算NDVI。使用获取的红光近红外波段数据计算NDVI,并将NDVI数据保存在data_ndvi数组中。

  最后,将NDVI数据写入输出影像文件。output_dataset.GetRasterBand()获取输出影像文件的波段,band.WriteArray()将数据写入波段,band.FlushCache()刷新波段缓存。

  此外,记得通过output_dataset.SetGeoTransform()output_dataset.SetProjection()设置输出影像文件的地理变换和投影信息。

  同时,需要清理和关闭数据集,将数据集和输出数据集设置为None以释放资源。还可以打印文件名finished!,表示当前文件处理完成。

  执行上述代码,我们即可在结果文件夹中看到计算得到的NDVI数据;如下图所示。

  至此,大功告成。

标签:Python,dataset,band,遥感,output,NDVI,data,影像
From: https://www.cnblogs.com/fkxxgis/p/18536887

相关文章

  • 【黑马python:函数进阶】81-84
    目录一、函数的多个返回值二、函数的多种传参方式1.函数参数种类1.1位置参数与关键字参数1.2缺省参数1.3不定长参数三、函数作为参数传递四、匿名函数一、函数的多个返回值如果一个函数要有多个返回值,该如何书写代码?按照返回值的顺序,写对应顺序的多个变量接......
  • python+flask计算机毕业设计个人碳足迹系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于碳足迹的研究,现有研究多集中在宏观层面的碳排放总量分析以及企业层面的碳足迹管理等方面。例如,许多研究聚焦于国家或大型企业的碳......
  • python+flask计算机毕业设计好骑行打卡园app系统(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容好骑行打卡园app系统毕业设计相关内容说明一、选题背景随着骑行运动在全球范围内的日益流行,与之相关的数字化服务......
  • Python绘制完整正弦余弦函数曲线
    1,将正弦函数,余弦函数及坐标轴绘制在同一个界面方便对比观察,不同函数的曲线变化importturtle#导入turtle图形库,用于绘图importmath#导入math库,用于数学计算,如三角函数#设置绘图窗口screen=turtle.Screen()screen.title('正弦余弦函数曲线')#设置窗口标题......
  • 基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5
    《------往期经典推荐------》一、AI应用软件开发实战专栏【链接】项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.......
  • 零基础快速掌握python【函数】相关内容及【操作练习】(内附代码)
    1.函数1.1函数的定义函数的定义:实现【特定功能】的代码块。函数的作用:简化代码提高代码重用性便于维护和修改提高代码的可扩展性函数的三要素:功能  len()  max()   sum()参数  s.clear()   s.append('hello')返回值 s.sort()   s1=sor......
  • Python代码文件不只是“.py”
       今天同事给我扔了一个.pyd文件,说让我跑个数据。然后我就傻了。。不知道多少粉丝小伙伴会run.pyd代码文件?如果你也懵懵的,请继续往下读吧。。今天科普下各类Python代码文件的后缀,给各位Python开发“扫扫盲”。.py最常见的Python代码文件后缀名,官方称Python源代码文......
  • Python基础(九):字典
    目录1、字典基础2、键与值的特性3、创建空字典4、访问字典中的值5、修改字典6、删除字典元素7、字典内置函数&方法    在Python的世界里,字典是一种强大的数据结构,它允许我们以键值对的形式存储和检索数据。这种结构不仅灵活,而且功能强大,是处理复杂数据时不可......
  • Python内置函数1详解案例
    1.列表的最值运算描述牛牛给了牛妹一个一串无规则的数字,牛妹将其转换成列表后,使用max和min函数快速的找到了这些数字的最值,你能用Python代码实现一下吗?输入描述:输入一行多个整数,数字之间以空格间隔。输出描述:输出这些数字的zuizhi示例1输入:35691062输出:10......
  • Python和Terraform和状态管理
    让我为您详细介绍如何基于Python和Terraform实现云端自动部署,包括最佳实践、状态管理以及如何使用Python管理Terraform的状态。目录整体架构概述项目结构Terraform状态管理使用Python管理Terraform最佳实践示例代码1.项目结构2.Terraform配置3.Python脚......