1、遥感解译建立Mask
通过遥感解译,从完全覆盖遥感影像的面中切出想要的图斑,将图斑的属性赋值为255,其他区域赋值为0,同时Nodata值一定要重分类为0。
面转栅格,生成一个黑白Mask用来标记区域。 坐标系需要注意,两者完全一致。同时也要保证两者影像范围全部一样。
2、使用python滑动裁剪图像及标签
上述获得的影像数据和标签数据尺寸是几千几千,对于模型来说过大,这里使用python+gdal库自动裁剪YOLO适用的640X640(或其他尺寸,2的n次方)的图像,并按一定命名方式存储(0,1,2,3......命名) 同时对影像数据和标签数据裁剪。 代码:
运行中,这一步主要踩的雷就是GDAL库,这个看版本,有的是直接import,有的不行会提示没有,pip下载却会提醒已经下载。那就需要改为 from osgeo import gdal 。
import os
import sys
try:
import gdal
except:
from osgeo import gdal
import numpy as np
from PIL import Image
# 保存tif文件函数
def writeTiff(im_data, im_geotrans, im_proj, path):
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
elif len(im_data.shape) == 2:
im_data = np.array([im_data])
im_bands, im_height, im_width = im_data.shape
# 创建文件
driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(path, int(im_width), int(im_height), int(im_bands), datatype)
if (dataset != None):
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
# 像素坐标和地理坐标仿射变换
def CoordTransf(Xpixel, Ypixel, GeoTransform):
XGeo = GeoTransform[0] + GeoTransform[1] * Xpixel + Ypixel * GeoTransform[2]
YGeo = GeoTransform[3] + GeoTransform[4] * Xpixel + Ypixel * GeoTransform[5]
return XGeo, YGeo
'''
滑动窗口裁剪Tif影像
TifPath 影像路径
SavePath 裁剪后影像保存目录
CropSize 裁剪尺寸
RepetitionRate 重叠度
'''
def TifCrop(TifPath, SavePath, CropSize, RepetitionRate):
print("--------------------裁剪影像-----------------------")
CropSize = int(CropSize)
RepetitionRate = float(RepetitionRate)
dataset_img = gdal.Open(TifPath)
if dataset_img == None:
print(TifPat