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

这篇博客分享了如何利用Python的GDAL库读取TIFF文件,以及如何通过numpy高效地对遥感图像进行256x256的切片操作。作者打算深入学习深度学习在遥感领域的应用,并提到了可能从框架转向使用TensorFlow。
摘要由CSDN通过智能技术生成

博客已同步微信公众号: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 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),即具体指定各个维度上移动的步幅)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒茄子

不装逼我浑身难受aaa

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值