使用python批量计算栅格像元值(像元总值等)
1. 单个栅格像元数值计算
import rasterio
from rasterio import plot
import numpy as np
from scipy.stats import mode# 打开TIF文件
with rasterio.open('path.tiff') as src:# 读取栅格数据data = src.read(1) # 只读取第一个band# 计算总像元值total_pixel_value = np.sum(data)# 计算最大值max_value = np.max(data)# 计算最小值min_value = np.min(data)# 计算平均值mean_value = np.mean(data)# 计算中位数median_value = np.median(data)# 计算众数mode_value, _ = mode(data, axis=None)# 计算均方根误差(RMSE)# 假设你有一个参考值或者你想使用所有像元的平方和的平均值来计算RMSE# 这里我们使用整个数据集的平方和的平均值来近似计算RMSErmse = np.sqrt(np.mean(data**2))# 打印结果print(f"总像元值: {total_pixel_value}")print(f"最大值: {max_value}")print(f"最小值: {min_value}")print(f"平均值: {mean_value}")print(f"中位数: {median_value}")print(f"众数: {mode_value}")print(f"均方根误差 (RMSE): {rmse}")
2. 批量计算并写入csv
import rasterio
from rasterio import plot
import numpy as np
from scipy.stats import mode
import os
import csv# 指定要处理的TIF文件所在的目录
tif_directory = 'path_to_your_tif_directory'# 指定输出CSV文件的路径
output_csv_file = 'output.csv'# 定义要写入CSV文件的列名
column_names = ['Filename', 'Total Pixel Value', 'Max Value', 'Min Value', 'Mean Value', 'Median Value', 'Mode Value', 'RMSE']# 打开CSV文件进行写入
with open(output_csv_file, mode='w', newline='', encoding='utf-8') as csv_file:writer = csv.writer(csv_file)# 写入列名writer.writerow(column_names)# 遍历TIF文件列表for tif_file in os.listdir(tif_directory):if tif_file.endswith('.tiff'):# 构建完整的文件路径file_path = os.path.join(tif_directory, tif_file)# 打开TIF文件with rasterio.open(file_path) as src:# 读取栅格数据data = src.read(1) # 只读取第一个band# 计算总像元值total_pixel_value = np.sum(data)# 计算最大值max_value = np.max(data)# 计算最小值min_value = np.min(data)# 计算平均值mean_value = np.mean(data)# 计算中位数median_value = np.median(data)# 计算众数mode_value, _ = mode(data, axis=None)# 计算均方根误差(RMSE) # 这里我们使用整个数据集的平方和的平均值来近似计算RMSErmse = np.sqrt(np.mean(data**2))# 写入CSV文件writer.writerow([tif_file, total_pixel_value, max_value, min_value, mean_value, median_value, mode_value, rmse])print(f"统计数据已写入 {output_csv_file}")
说明:在计算tif栅格像元值的时候需要注意tif的数值类型,整数还是浮点。
在计算6位数值时,python会自动转成8位byte,这会影响计算结果。
感谢阅读