python遥感影像最大值合成

前言

由于数据处理的区域受云的影响较大,经过去云操作后出现大量0值,故想用该影像周围几天的像元值来填补有云影像



代码

一、引入库?

from osgeo import gdal
import numpy as np
import os

二、完整代码

1.函数

def write_tif(data_raw,targetdata,output_name):
    driver = gdal.GetDriverByName('GTiff')
    out_file = driver.Create(output_name,targetdata.shape[1],targetdata.shape[0],1,6)
    out_file.SetProjection(data_raw.GetProjection())
    out_file.SetGeoTransform(data_raw.GetGeoTransform())
    out_file.GetRasterBand(1).WriteArray(targetdata)
    del out_file

2.主体

input_file = 'G:/Test/'
output_file = 'G:/Test/Test_mvc/'
prefix = '.tif'

if not os.path.exists(output_file):
    os.mkdir(output_file)

file_all = os.listdir(input_file)
file_num = len(file_all)

for i in range(file_num):
    if file_all[i].endswith(prefix):
        data_box = ''
        interpol_data = gdal.Open(input_file + file_all[i])
        interpoled_data = interpol_data.ReadAsArray()
        output_name = output_file + os.path.splitext(file_all[i])[0] + '_mvc.tif'
        if i == 0:
            data_box = file_all[i:i+2]
            for j in range(len(data_box)):
                if file_all[i] == data_box[j]:
                    continue
                else:
                    data = gdal.Open(input_file + data_box[j])
                    data_array = data.ReadAsArray()
                    interpoled_data = (data_array >= interpoled_data)*data_array + (interpoled_data > data_array)*interpoled_data
            write_tif(data,interpoled_data,output_name)
        elif i == 1:
            data_box = file_all[i-1:i+2]
            for j in range(len(data_box)):
                if file_all[i] == data_box[j]:
                    continue
                else:
                    data = gdal.Open(input_file + data_box[j])
                    data_array = data.ReadAsArray()
                    interpoled_data = (data_array >= interpoled_data)*data_array + (interpoled_data > data_array)*interpoled_data
            write_tif(data,interpoled_data,output_name)
        elif i == file_num-1:
            data_box = file_all[i-2:i+1]
            for j in range(len(data_box)):
                if file_all[i] == data_box[j]:
                    continue
                else:
                    data = gdal.Open(input_file + data_box[j])
                    data_array = data.ReadAsArray()
                    interpoled_data = (data_array >= interpoled_data)*data_array + (interpoled_data > data_array)*interpoled_data
            write_tif(data,interpoled_data,output_name)
        elif i == file_num:
            data_box = file_all[i-2:i+1]
            for j in range(len(data_box)):
                if file_all[i] == data_box[j]:
                    continue
                else:
                    data = gdal.Open(input_file + data_box[j])
                    data_array = data.ReadAsArray()
                    interpoled_data = (data_array >= interpoled_data)*data_array + (interpoled_data > data_array)*interpoled_data
            write_tif(data,interpoled_data,output_name)
        else:
            data_box = file_all[i-2:i+2]
            for j in range(len(data_box)):
                if file_all[i] == data_box[j]:
                    continue
                else:
                    data = gdal.Open(input_file + data_box[j])
                    data_array = data.ReadAsArray()
                    interpoled_data = (data_array >= interpoled_data)*data_array + (interpoled_data > data_array)*interpoled_data
            write_tif(data,interpoled_data,output_name)

结果对比

此处以处理前后的同一天影像为例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

以上就是以近5天为窗口对整个文件夹的影像进行滑动最大值合成的代码。

### 计算逐月NDVI的最大值合成图像 为了计算逐月NDVI的最大值合成图像,可以采用多种方法和技术栈来完成这一任务。下面将分别介绍基于Python编程语言以及使用特定遥感软件的方法。 #### Python 编程实现 通过Python及其科学计算库(如`numpy`, `rasterio`, 和`xarray`),能够高效地处理栅格数据并执行复杂的统计运算。以下是具体的操作流程: 1. **加载所需模块** ```python import os from datetime import date, timedelta import numpy as np import rasterio from rasterio.enums import Resampling ``` 2. **定义函数用于获取每个月的第一天和最后一天日期** ```python def get_month_start_end(year, month): start_date = date(year, month, 1) if month == 12: end_date = date(year + 1, 1, 1) - timedelta(days=1) else: end_date = date(year, month + 1, 1) - timedelta(days=1) return start_date.strftime('%Y%m%d'), end_date.strftime('%Y%m%d') ``` 3. **遍历文件夹中的所有NDVI影像,并筛选属于同一月份的数据集** 假设所有的NDVI影像都按照YYYYMMDD格式命名,则可以通过解析文件名来判断其所属月份。 4. **读取各个月份对应的多个NDVI影像,并求解最大值** 对于每个选定的月份,在该时间段内的所有可用NDVI影像上应用最大值算法。 5. **保存结果至新的GeoTIFF文件中** 最终得到的结果是一个包含每月最高NDVI值的新图层集合。 ```python for year in range(start_year, end_year+1): for month in range(1, 13): first_day, last_day = get_month_start_end(year, month) # 构建查询条件以匹配当前月份的所有NDVI文件路径列表 ndvi_files = [f for f in all_ndvi_files if (first_day <= f.split('/')[-1][:8] <= last_day)] max_value_array = None with rasterio.open(ndvi_files[0]) as src: profile = src.profile for file_path in ndvi_files: with rasterio.open(file_path) as ds: current_data = ds.read(out_shape=(ds.count, int(src.height), int(src.width)), resampling=Resampling.bilinear)[0] if max_value_array is None: max_value_array = current_data.copy() else: mask = ~np.isnan(current_data) max_value_array[mask] = np.maximum(max_value_array[mask], current_data[mask]) output_file_name = f"{year}_{month}_max_ndvi.tif" with rasterio.open(output_file_name, 'w', **profile) as dst: dst.write_band(1, max_value_array.astype(rasterio.float32)) ``` 此段代码实现了对给定年份内每个月份下的所有NDVI影像进行最大值复合的功能[^1]。 #### 遥感专用软件解决方案 除了编写脚本外,还可以借助专业的地理信息系统(GIS)平台来进行这项工作。例如,在ENVI-IDL环境中提供了专门针对时间序列分析的功能模块,可以直接调用内置工具完成逐月NDVI最大值合成的任务。同样地,在ArcGIS Pro里也可以利用Image Analyst扩展包里的“Cell Statistics”功能轻松达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值