【Python】基于Python统计文件目录内每景栅格图像均值并输出成表

目录

  • 1 简介
  • 2 效果展示
  • 3 代码

1 简介

乔博士最近在做一个研究,涉及到过去十几年某些地区某些指标逐日的提取。一共五个地区,各地区下五个指标,各指标5000+副影像需要获取均值。。。。。所以一共大概好几万副影像需要统计。。。然而在ArcGIS上手动做还是通过ArcPy做都不太现实,所以就问问我有没有相关的代码程序:
在这里插入图片描述
我是有的,然而因为我之前涉及的没有那么多影像,最多也就几十景求均值,所以现成的代码是输入在终端里的。所以乔博士又提出了这么个要求:
在这里插入图片描述
所以,这次的代码目标是提取某个文件夹里所有影像的均值,并且输出成excel可以读的表,方便后续的研究。

2 效果展示

首先,得把tif扔进一个文件夹里:
【Python】基于Python统计文件目录内每景栅格图像均值并输出成表_第1张图片
然后使用后面要贴出来的代码,就可以得到一个csv文件,csv文件里是这样的:
【Python】基于Python统计文件目录内每景栅格图像均值并输出成表_第2张图片
同时终端里是这样的:
【Python】基于Python统计文件目录内每景栅格图像均值并输出成表_第3张图片
可以说是一模一样!
我们就可以通过这个csv进一步方便的进行排序、制图什么的了。

3 代码

from osgeo import gdal
import glob
import numpy as np
import csv

# 计算栅格图像均值
def calc_grid_mean(tiffile, csvpath):
    open_tif = gdal.Open(tiffile) # 打开tif文件
    # 打开栅格图像的波段
    band = open_tif.GetRasterBand(1).ReadAsArray()
    count_value = [] # 存放像元值的数组
    # 遍历图像矩阵,剔除异常值,读取有效值
    for i in range(len(band)):
        for j in range(len(band[i])):
            if band[i][j] >= -1000:
                count_value.append(band[i][j]) # 将有效值放入新数组
    # 把文件名和参数写入csv
    mycsv = open(str(csvpath), 'a', newline='') # 新建并打开csv
    csv_write = csv.writer(mycsv, dialect='excel')
    tif_info = (str(tif[-18:]), float(np.mean(count_value))) # 把文件名称+均值整合为一行
    csv_write.writerow(tif_info) # 把文件名称+均值写入csv
    print(f'{str(tif[-18:])}, {np.mean(count_value)}') # 在终端中打印出文件名称+均值


csv_path = r'csv.csv' # csv输出路径
tif_dir = glob.glob(r'文件夹\*.tif') # tif目录

for tif in tif_dir: # 遍历文件夹
    calc_grid_mean(tif, csv_path) # 计算均值

这个代码涉及到一个函数+一个遍历。
函数是读取一张tif并且计算均值,因为有些在ArcGIS裁剪后的图像空值其实是负好几,所以我设置了一个条件,选取大于-1000的。
遍历就是遍历选取的文件夹里的所有tif,通过上面的函数计算均值写入同一个csv里。
-----------------------分割线(以下是乞讨内容)-----------------------
在这里插入图片描述

你可能感兴趣的:(Python,遥感,python,遥感,栅格图像)