明党参

首页 » 常识 » 问答 » 技术分享遥感影像切片
TUhjnbcbe - 2022/3/6 19:28:00

该技术对于制作遥感影像的深度学习数据集十分有帮助。分享一种遥感影像切片的方法,即一张影像切分成具有相同行列数的小影像,相邻影像可具有一定的重叠度。

1功能

将一幅大的影像切分成具有相同行列数的小影像,在制作深度学习数据集的时候十分的有用。特别是在语义分割任务。此工具源自我几年前的学习经验,觉得十分有用分享给朋友们。使用python基于分块读写的思路分别读取指定大小的数量并写出为小影像。对于几百G大小的巨型影像的读写也提供了一个思路。

2参数介绍

设置输入影像路径、输出文件夹路径、切片行列数大小、相邻重叠度、多进程加速处理、是否输出无效切片、是否保留边缘。

(使用多进程可明显提高切片的速度,一般人我不告诉他。)

RasterPath:str,输入影像的路径OutPath:str,输出文件夹,如果不存在则会被创建Size:int,输出小影像的行列数大小,整数Lap:[可选]int,输出相邻切片的重叠度,默认为0不重叠Threads:[可选]int,进程数,默认为0使用单进程处理KeepALL:[可选]bool,是否输出无效切片,即一个切片的最小值等于最大值时是否保留,默认为FalseKeepMargin:[可选]bool,是否保留边缘切片,边缘切片不够Size大小的时候是否保留,默认为FalseFillValue:[可选]"nodata"或数字。保留边缘时,超出边缘部分的填充值,只有KeepMargin为True的时候有效。默认为nodata(1)此值为"nodata":使用源数据的nodata,如果源数据没有nodata则以0填充;(2)此值为数字:使用给定的数字填充3使用

在python代码的main函数中修改参数。示例

RasterPath=r"D:\data\T_T_T51SUD.tif"OutPath=r"D:\data\split"Size=Lap=Threads=6KeepAll=FalseKeepMargin=TrueFillValue=t0=time.time()SplitImage(RasterPath,OutPath,Size,Lap=Lap,Threads=Threads,KeepALL=KeepAll,KeepMargin=KeepMargin,FillValue=FillValue)print("timesis%.3fs"%(time.time()-t0))4主要代码

defSplitImage(RasterPath,OutPath,Size,Lap=0,Threads=0,KeepALL=False,KeepMargin=False,FillValue="nodata"):ifnotos.path.exists(OutPath):os.makedirs(OutPath)ifnotOutPath.endswith(os.path.sep):OutPath=OutPath+os.path.sepdataset=gdal.Open(RasterPath)proj=dataset.GetProjection()gt=dataset.GetGeoTransform()datatype=dataset.GetRasterBand(1).ReadAsArray(0,0,1,1).dtype.name#获取无效值,认为每个波段的无效值是相同的nodata=dataset.GetRasterBand(1).GetNoDataValue()#numpy的数据类型,转换为gdal的数据类型gdaltype=NP2GDAL_CONVERSION[datatype]#总行列数cols,rows=dataset.RasterXSize,dataset.RasterYSizedataset=None#获取分片的行数和列数numx=int(np.ceil((cols-Size)/(Size-Lap)+1))numy=int(np.ceil((rows-Size)/(Size-Lap)+1))maxCells=max(numx,numy)weishu=len(str(maxCells))#numx,numy=int(np.ceil(cols/size)),int(np.ceil(rows/size))numxs=[(Size-Lap)*(i-1)foriinrange(1,numx+1)]numys=[(Size-Lap)*(i-1)foriinrange(1,numy+1)]dex=[f"%.{weishu}d"%iforiinrange(10**weishu)]ifThreads=1:#单进程forjinnumys:foriinnumxs:split(RasterPath,OutPath,dex,i,j,Size,Lap,cols,rows,gdaltype,datatype,gt,proj,nodata,KeepALL,KeepMargin,FillValue)else:#多进程pool=Pool(Threads)forjinnumys:foriinnumxs:pool.apply_async(split,args=(RasterPath,OutPath,dex,i,j,Size,Lap,cols,rows,gdaltype,datatype,gt,proj,nodata,KeepALL,KeepMargin,FillValue))pool.close()pool.join()5结果展示

切分前的影像

切分后的影像。由于拉伸的原因,颜色显示会与原始影像不同,但像素值是相同的。

波段数、像素类型与原文件保持一致。

切分后的文件如图所示,最后面的C和R后面的数字分别为对应的列号和行号。

6代码获取

为了方便使用和技术分享,这里直接分享源代码。进入我的小程序“GIS宝库”发送暗号split获取。

长按识别小程序码进入。

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: 技术分享遥感影像切片