处理文件夹中的栅格影像,如果X方向(宽度)且Y方向(高度)的尺寸大于19580,则裁剪掉右侧和上侧像素;如果X方向(宽度)大于,Y方向(高度)小于19580,则裁剪掉右侧和用边缘像素值填充上侧像素,

要处理文件夹中的栅格影像,如果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)





你可能感兴趣的:(python,简单地理应用,python)