遥感&深度学习:如何读取TIFF文件和切片成256*256?

2023-12-13 03:48:35

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 False
        
    bands = 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_windows


def 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),即具体指定各个维度上移动的步幅)。

文章来源:https://blog.csdn.net/m0_63001937/article/details/134836121
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。