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
# 这里我们使用整个数据集的平方和的平均值来近似计算RMSE
rmse = 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)
# 这里我们使用整个数据集的平方和的平均值来近似计算RMSE
rmse = 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,这会影响计算结果。
感谢阅读