博客已同步微信公众号:GIS不要炒茄子
01 前言
最近打算认真从头开始学习深度学习和遥感结合的相关内容,主要通过Python进行处理。此前用深度学习进行遥感相关的学习一直都是用 tensorflow3.0
框架,但是考虑很多因素我后面打算换用 Pytorch
进行学习。好在tensorflow我只是浅尝辄止,不然还真有点不舍。
02 如何读取TIFF文件
2.1 安装GDAL
读取TIFF文件我们就用GDAL
吧,安装稍麻烦。如果通过pip方式无法安装模块,可通过下方链接下载Wheel文件:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#
下载后通过pip install wheel文件绝对路径
即可安装。如果想要安装在虚拟环境,需要先进入对应虚拟环境路径activate
再进行pip安装。
2.2 读取TIFF文件
这个就仅仅给出代码吧,其它时间有限自行理解。
一个波段一个波段的读取:
def read_img(img_path):"""该函数用于读取TIFF文件中各个波段数据集:param img_path: TIFF文件路径:return: 多波段数据集(ndarray, [波段数, 行数, 列数])"""# 打开文件ds = gdal.Open(img_path)if not ds:return False# 读取bands = []for band_ix in range(1, ds.RasterCount + 1):band = ds.GetRasterBand(band_ix)band_data = band.ReadAsArray()bands.append(band_data)bands = np.asarray(bands)return bands
当然,一下全部读取也可以:
def read_img(img_path):"""该函数用于读取TIFF文件中各个波段数据集:param img_path: TIFF文件路径:return: 多波段数据集(ndarray, [波段数, 行数, 列数])"""# 打开文件ds = gdal.Open(img_path)if not ds:return Falsebands = ds.ReadAsArray()return bands
03 如何切片?
切片你可以用numpy的 from numpy.lib.stride_tricks import as_strided
自己写(谨慎使用该函数),当然或者完全自己写。但是运行的效率自然无法保证。
这里我们用 skimage
模块的 view_as_windows
函数进行切片,不仅支持高维度切片并且效率非常高。
import numpy as np
from skimage.util import view_as_windowsdef make_chips(ds, window_shape, stride, stacking=False):"""对数据集进行切片处理:param ds::param window_shape: 滑动窗口大小:param stride: 步幅大小:return: 返回切片后的数据"""chips = view_as_windows(ds, window_shape, step=stride)chips = np.squeeze(chips) # 去除维度上数值为1的所有维度if stacking:chips = np.reshape(chips.shape[0] * chips.shape[1], -1)return chips
使用:
img_paths = glob.glob(os.path.join(in_dir, '**', 'GF2*MSS*.tiff'), recursive=True)
for img_path in img_paths:# 读取data = read_img(img_path)# img_transform = get_transform(img_path)# 切片chips = make_chips(data, (4, 256, 256), 256, False)
data的shape为(4, 6908, 7300),我需要切片为(4,256, 256),那么滑动窗口大小设置为(4, 256, 256),窗口在各个维度上移动的步幅大小这里设置为256(当然你也可以设置为(4, 256,256),即具体指定各个维度上移动的步幅)。