要处理文件夹中的栅格影像,如果X方向(宽度)且Y方向(高度)的尺寸大于19580,则裁剪掉右侧和上侧像素;如果X方向(宽度)大于,Y方向(高度)小于19580,则裁剪掉右侧和用边缘像素值填充上侧像素,如果X方向(宽度)小于,Y方向(高度)大于19580,则边缘像素值填充右侧像素和裁剪掉上侧,如果小于,则用边缘像素值填充至19580像素。
from osgeo import gdal
import numpy as np
import os
def remove_outliers_using_3sigma(arr):
"""使用3σ法则剔除异常值"""
mean = np.mean(arr)
std = np.std(arr)
lower_bound = mean - 3 * std
upper_bound = mean + 3 * std
arr[(arr < lower_bound) | (arr > upper_bound)] = mean
return arr
def process_raster(input_tif, output_tif, target_size=19580):
"""处理栅格影像的大小,根据不同情况裁剪或填充"""
# 打开原始影像
src_ds = gdal.Open(input_tif)
src_band = src_ds.GetRasterBand(1)
x_size = src_ds.RasterXSize
y_size = src_ds.RasterYSize
# 创建新数组
new_array = np.full((target_size, target_size), src_band.GetNoDataValue(), dtype=np.uint8)
# 判断并处理影像
if x_size > target_size and y_size > target_size:
# 如果两个方向都大于目标尺寸,则裁剪
src_array = src_band.ReadAsArray(0, 0, target_size, target_size)
new_array = src_array
elif x_size > target_size:
# 如果宽度大于目标尺寸,裁剪宽度,填充高度
src_array = src_band.ReadAsArray(0, 0, target_size, y_size)
new_array[:y_size, :] = src_array
if y_size < target_size:
new_array[y_size:, :] = src_array[-1, :][np.newaxis, :]
elif y_size > target_size:
# 如果高度大于目标尺寸,裁剪高度,填充宽度
src_array = src_band.ReadAsArray(0, 0, x_size, target_size)
new_array[:, :x_size] = src_array
if x_size < target_size:
new_array[:, x_size:] = src_array[:, -1][:, np.newaxis]
else:
# 如果两个方向都小于目标尺寸,则填充
src_array = src_band.ReadAsArray()
new_array[:y_size, :x_size] = src_array
if y_size < target_size:
new_array[y_size:, :x_size] = src_array[-1, :][np.newaxis, :]
if x_size < target_size:
new_array[:, x_size:] = new_array[:, x_size - 1][:, np.newaxis]
# 剔除异常值
# new_array = remove_outliers_using_3sigma(new_array)
# 创建输出数据源
driver = gdal.GetDriverByName('GTiff')
dst_ds = driver.Create(output_tif, target_size, target_size, 1, src_band.DataType)
dst_ds.SetGeoTransform(src_ds.GetGeoTransform())
dst_ds.SetProjection(src_ds.GetProjection())
dst_band = dst_ds.GetRasterBand(1)
dst_band.WriteArray(new_array)
dst_band.SetNoDataValue(src_band.GetNoDataValue())
# 保存和清理
dst_band.FlushCache()
dst_band = None
dst_ds = None
src_band = None
src_ds = None
# 输入和输出文件夹路径
input_folder_path = 'dataset/all'
output_folder_path = 'dataset/all_image_size'
# 确保输出文件夹存在
if not os.path.exists(output_folder_path):
os.makedirs(output_folder_path)
# 处理文件夹中的每个栅格文件
for filename in os.listdir(input_folder_path):
if filename.endswith('.tif'):
input_tif_path = os.path.join(input_folder_path, filename)
output_tif_path = os.path.join(output_folder_path, filename)
process_raster(input_tif_path, output_tif_path)