Python ArcPy批量计算多时相遥感影像的各项元平均值
本文介绍基于
Python
中
ArcPy
模块,对大量
长时间序列
栅格遥感影像文件的
每一个像元
进行
多时序平均值
的求取。
在遥感应用中,我们经常需要对
某一景
遥感影像中的
全部像元的像素值
进行平均值求取——这一操作很好实现,基于
ArcMap
软件或者简单的
Python
代码就可以实现;但有时候,我们会需要结合同一地区、
不同时相
的
多景
遥感影像,求取
每一个像元
在
全部时相
中像素值的平均值——这一需求的实现较之前者就有些麻烦,本文对此加以介绍。
首先,我们来明确一下本文的具体需求。现有一个存储有大量
.tif
格式遥感影像的文件夹,其中每一个遥感影像的文件名中都包含有该图像的成像时间,如下图所示。且其中除了
.tif
格式的遥感影像文件外,还具有其它格式的文件。
我们希望,对于
同一年
成像的遥感影像进行逐像元平均值的求取。例如,上图中具有
2001
年第
185
天成像、第
193
天成像、第
201
天成像……等等遥感影像
8
幅,每一幅都是这一年不同时间在同一空间位置的成像;同时,还有
2005
年不同时间成像的遥感影像
9
幅。我们希望,首先将
2001
年成像的
8
幅遥感影像加以逐像元平均值的求取,即求取
每一个像元
在这
8景图像
中像素值的平均;随后再对
2005
年成像的
9
幅遥感影像加以逐像元平均值的求取,以此类推。
明确了需求后,我们就可以开始具体的操作。首先,本文所需用到的代码如下。
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 16 10:48:37 2022
@author: fkxxgis
"""
import arcpy
from arcpy.sa import *
tif_file_path="E:/LST/Data/MODIS/05_Resample/"
average_file_path="E:/LST/Data/MODIS/06_Average/"
arcpy.env.workspace=tif_file_path
tif_file_name=arcpy.ListRasters("*","tif")
tif_file_year=tif_file_name[0][0:4]
one_year_tif_list=[]
sum_pic=0
for tif_file in tif_file_name:
if tif_file[0:4]==tif_file_year:
one_year_tif_list.append(tif_file)
tif_file_temp=tif_file
if tif_file==tif_file_name[len(tif_file_name)-1]:
pic_num=len(one_year_tif_list)
for tif_file_new in one_year_tif_list:
sum_pic=sum_pic+Raster(tif_file_new)
(sum_pic/pic_num).save(average_file_path+tif_file_year+"_Ave.tif")
else:
pic_num=len(one_year_tif_list)
for tif_file_new in one_year_tif_list:
sum_pic=sum_pic+Raster(tif_file_new)
(sum_pic/pic_num).save(average_file_path+tif_file_year+"_Ave.tif")
one_year_tif_list=[]
sum_pic=0
one_year_tif_list.append(tif_file)
tif_file_year=tif_file[0:4]
其中,
tif_file_path
是原有计算平均值前遥感图像的保存路径,
average_file_path
是我们新生成的求取平均值后遥感影像的保存路径,也就是结果保存路径。
在这里,和我们前期的博客
Python ArcPy批量拼接长时间序列栅格图像
类似,需要首先在
资源管理器中
,将
tif_file_path
路径下的各文件以“
名称
”排序的方式进行排序;随后,利用
arcpy.ListRasters()
函数,获取路径下原有的全部
.tif
格式的图像文件,并截取第一个文件的部分文件名,从而获取其成像时间的具体年份。
接下来,遍历
tif_file_path
路径下全部
.tif
格式图像文件。其中,我们通过一个简单的判断语句
if tif_file[0:4]==tif_file_year:
,来确定某一年的遥感影像是否已经读取完毕——如果已经读取完毕,例如假如
2001
年成像的8幅遥感影像都已经遍历过了,那么就对这8景遥感影像加以逐像元的平均值求取,并开始对下一个年份(即
2005
年)成像的遥感影像继续加以计算;如果还没有读取完毕,例如假如
2001
年成像的8幅遥感影像目前仅遍历到了第5幅,那么就不求平均值,继续往下遍历,直到遍历完
2001
年成像的8幅遥感影像。
这里相信大家也看到了为什么我们要在前期先将文件夹中的文件按照“
名称
”排序——是为了保证
同一年成像的所有遥感影像都排列在一起
,遍历时只要遇到一个
新的年份
,程序就知道
上一个年份
的所有图像都已经遍历完毕了,就可以将
上一个年份
的所有栅格图像加以平均值求取。
在这里,逐像元的平均值求取其实也非常简单——我们对每一个像元分别执行以下操作:首先将该像元在当前年份里所有
遥感影像的像素值
相加,随后除以这一年份的
遥感影像的数量
,得到的就是该像元在这一年中
像素值的平均值
。
最后,通过
if tif_file==tif_file_name[len(tif_file_name)-1]:
这个判断,来确认是否目前已经遍历到文件夹中的
最后一个
图像文件。如果是的话,就需要将
当前成像年份
的所有图像进行平均值的求取,并宣告代码完成运行。
在
IDLE (Python GUI)
中运行代码。代码运行完毕后,我们看一下结果文件夹。可以看到,其中的图像已经是按照成像时间,分别完成平均值求取后的结果了。
在最后,还需要说明一点——用以上代码来求取长时间序列遥感影像的像元平均值,对于任意一个像元,只要该像元在
任意一个时相
的图像中是无效值(即为
NoData
),那么该像元在最终求出的平均值
结果图中
,像素值也将会是无效值
NoData
。针对这一问题的解决,我们将在下一篇博客中介绍。