查了好多,就是没有栅格填充,别说多通道了,自己就写了一个。可以依据裁剪窗口和滑动步长来填充大的遥感影像,然后进行滑动裁剪,增强数据的同时,避免了边缘对深度学习产生的影响。后续会出拼接回原始大小。
因为这是我很长很长代码的一部分,所以需要根据需要自取并修改
import cv2
import shutil
slide_window = 1024 # 裁剪窗口
step_length = 512
# 1.膨胀图像
source = 'dataset/sat_test/'
sat_path ="./dataset/sat_test/"
test_path ="./dataset/test/"
test_list = os.listdir(test_path)
# # print(file_list)
for file in test_list:
Image_Path = test_path+file
# #print(Image_Path)
# #print(Mask_Path)
image = gdal.Open(Image_Path)
image_name = file[:-4]
width = image.RasterXSize # 获取图像的宽
height = image.RasterYSize # 获取图像的高
outbandsize = image.RasterCount
datatype = image.GetRasterBand(1).DataType
right_fill = step_length - (width % step_length)
bottom_fill = step_length - (height % step_length)
# width_path_number = int((width - slide_window) / step_length) +1 # 横向切成的小图的数量
# height_path_number = int((height - slide_window ) / step_length) +1 # 纵向切成的小图的数量
width_path_number = int((width + right_fill) / step_length) # 横向切成的小图的数量
height_path_number = int((height + right_fill) / step_length) # 纵向切成的小图的数量
im_data = image.ReadAsArray()
im_data= im_data.transpose(1,2,0)
im_data = cv2.copyMakeBorder(im_data, top=0, bottom=bottom_fill, left=0, right=right_fill,
borderType=cv2.BORDER_CONSTANT, value=0)
im_data = cv2.copyMakeBorder(im_data, top=step_length // 2, bottom=step_length // 2, left=step_length // 2,
right=step_length // 2,
borderType=cv2.BORDER_CONSTANT, value=0) # 填充1/2步长的外边框
print('图像膨胀步骤完成!')
# 2.将膨胀后的大图按照滑窗裁剪
crop_source = './dataset/'
#tar=os.path.join('./dataset/',file[:-8]+'/'+'Image_Crop_Result/')
tar=os.path.join('./dataset/',file[:-8])
#shutil.rmtree(r"C:\Users\Administrator\Desktop\DeepGlobe-Road-Extraction-link34\dataset\Image_Crop_Result") # 递归删除文件夹下的所有内容包扩文件夹本身
if os.path.exists(tar):
shutil.rmtree(tar) # 递归删除文件夹下的所有内容包扩文件夹本身
os.mkdir(tar)
target=os.path.join(tar,'Image_Crop_Result/')
os.mkdir(target)
image_crop_addr = target # 图像裁剪后存储的文件夹
k=0
for j in range(height_path_number):
for i in range(width_path_number):
out_band = im_data[i * step_length:i * step_length + slide_window, j * step_length: j * step_length + slide_window,:]
out_band= out_band.transpose(2,0,1)
# 获取Tif的驱动,为创建切出来的图文件做准备
gtif_driver = gdal.GetDriverByName("GTiff")
# 创建切出来的要存的文件(3代表3个不都按,最后一个参数为数据类型,跟原文件一致)
filename = image_crop_addr + image_name[:-4] + '({},{})@{:09d}_sat.tif'.format(j,i, k) # 文件名称
k += 1
out_ds = gtif_driver.Create(filename, slide_window, slide_window, outbandsize, datatype)
# print("create new tif file succeed")
# 写入目标文件
out_ds.WriteArray(out_band)
# 将缓存写入磁盘
out_ds.FlushCache()
del out_ds