一、问题引入
最近在做遥感语义分割的实验时,发现样本的制作是一个比较棘手的问题,因此想要整理下代码,以供学习交流。
我的原始遥感图像样本是有54个波段(这是经过特征提取的,每个波段代表一个特征信息),最后一个波段是标签,因此我的目标是利用前53个特征波段来预测最后一个标签波段。现在我有一组大的遥感影像作为训练样本,但是这些图像形状不规则,因此想要输入深度学习模型中进行训练就需要进行图像切割,变成比如64*64的小尺寸的多个样本,这个就是本文想要分享的内容。
废话不多说,直接开始上码。
二、异常值处理
首先导入要用到的python库
import os
from osgeo import gdal
import numpy as np
import pandas as pd
这里我进行了一步异常值处理,由于我的第54波段,即标签存在一定的问题,因此我进行了一步根据阈值的滤除,去除了一些极大和极小值
先定义输入和输出的文件夹路径(输出文件夹一定要先创建好,不然会报错),并获取这个路径下的tif文件,如果大家是单个tif文件,可以直接将tiff_files改为文件路径
# 输入文件夹路径,包含要处理的TIFF文件,即大遥感图像
input_folder = "UNet实验数据/原始数据"
# 输出文件夹路径,用于存储处理后的TIFF文件
output_folder = "UNet实验数据/异常值处理"
# 获取输入文件夹中的所有TIFF文件
tiff_files = [f for f in os.listdir(input_folder) if f.endswith('.tif')]
下面写一段循环来处理这个文件夹下的遥感图像异常值,if语句后是处理的条件,这里我写的channel == 53,即第54波段,如果存在异常值,即 <label_min 或 >label_max,就变为nan值,这里label_min和label_max是我之前定义的,大家自行可以换成别的值。
# 循环处理每个TIFF文件
for tiff_file in tiff_files:
# 构建输入和输出文件的完整路径
input_path = os.path.join(input_folder, tiff_file)
output_path = os.path.join(output_folder, tiff_file)
# 打开输入TIFF文件
ds = gdal.Open(input_path, gdal.GA_ReadOnly)
# 获取输入TIFF文件的宽度、高度和通道数
image_width = ds.RasterXSize
image_height = ds.RasterYSize
num_channels = ds.RasterCount
# 创建输出TIFF文件
driver = gdal.GetDriverByName("GTiff")
out_ds = driver.Create(output_path, image_width, image_height, num_channels, gdal.GDT_Float32)
# 处理每个通道
for channel in range(num_channels):
channel_data = ds.GetRasterBand(channel + 1).ReadAsArray()
if channel == 53:
channel_data = np.where((channel_data < label_min) | (channel_data > label_max), np.nan, channel_data)
# 写入处理后的通道数据
out_ds.GetRasterBand(channel + 1).WriteArray(channel_data)
# 释放数据集
out_ds = None
print("处理完成。")
到这里就完成了异常值的处理,在输出文件夹中