怎么读取tif格式的卫星遥感数据,并将数据输入到神经网络模型中进行训练

该博客介绍了如何使用gdal库读取tif格式的卫星遥感数据,并针对高分二号卫星的四波段数据进行红绿蓝三波段的读取。同时,文章探讨了遥感数据的归一化处理,通过np.percentile方法进行数据映射,并展示了将tif格式数据转化为jpg的过程。最后,提供了一个批量转化tif到jpg的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.前言:

        tif格式的卫星遥感数据不同于jpg、png等普通的图像,普通jpg图像一般只有三通道值,即R、G、B三通道,png格式再加上Alpha通道,其数据值在[0——255]之间。tif格式的遥感影像,包含了众多波段的数据,除了RGB通道,还可能包含近红外、红边范围、短波红外等波段,常用来处理tif格式遥感影像的库是gdal。

二.读取tif遥感影像数据(以高分二号卫星遥感影像数据为例)

高分二号卫星多光谱包含蓝、绿、红、近红外四个波段,分别对应1、2、3、4

def readTif(imgPath, bandsOrder=[3, 2, 1]):       # 读取红绿蓝(RGB)三波段数据

    dataset = gdal.Open(imgPath, gdal.GA_ReadOnly)  # 返回一个gdal.Dataset类型的对象
    cols = dataset.RasterXSize                      # tif图像的宽度
    rows = dataset.RasterYSize                      # tif图像的高度
    data = np.empty([rows, cols, 3], dtype=float)   # 定义结果数组,将RGB三波段的矩阵存储
    for i in range(3):  
        band = dataset.GetRasterBand(bandsOrder[i]) # 读取波段数值
        oneband_data = band.ReadAsArray()           # 读取波段数值读为numpy数组
        print(oneband_data)
        data[:, :, i] = oneband_data                # 将读取的结果存放在三维数组的一页三
    return data

三.数据归一化问题、tif格式转化为jpg格式 

tif数据的值不同于RGB的取值在[0——255]之间,在几百到一千多不等,Nir近红外的值可以取到两千多。所以在输入模型之前进行归一化可以通过np.percentile()方法取最大值

np.percentile(band, 100.0)        # 返回当前band波段的最大值

tif格式转化为jpg格式,其实就是把tif数据值映射到[0——255]这个区间

import numpy as np
import os
from PIL import Image
from osgeo import gdal

# Stop GDAL printing both warnings and errors to STDERR
gdal.PushErrorHandler('CPLQuietErrorHandler')

# Make GDAL raise python exceptions for errors (warnings won't raise an exception)
gdal.UseExceptions()


def readTif(imgPath, bandsOrder=[3, 2, 1]):
    """
    读取GEO tif影像的前三个波段值,并按照R.G.B顺序存储到形状为【原长*原宽*3】的数组中
    :param imgPath: 图像存储全路径
    :param bandsOrder: RGB对应的波段顺序,如高分二号多光谱包含蓝,绿,红,近红外四个波段,RGB对应的波段为3,2,1
    :return: R.G.B三维数组
    """
    dataset = gdal.Open(imgPath, gdal.GA_ReadOnly)  # 返回一个gdal.Dataset类型的对象
    cols = dataset.RasterXSize                      # tif图像的宽度
    rows = dataset.RasterYSize                      # tif图像的高度
    data = np.empty([rows, cols, 3], dtype=float)   # 定义结果数组,将RGB三波段的矩阵存储
    for i in range(3):  
        band = dataset.GetRasterBand(bandsOrder[i]) # 读取波段数值
        oneband_data = band.ReadAsArray()           # 读取波段数值读为numpy数组
        #print(oneband_data)
        data[:, :, i] = oneband_data                # 将读取的结果存放在三维数组的一页三
    return data

def stretchImg(imgPath, resultPath, lower_percent=0.5, higher_percent=99.5):
    """
    #将光谱DN值映射至0-255,并保存
    :param imgPath: 需要转换的tif影像路径(***.tif)
    :param resultPath: 转换后的文件存储路径(***.jpg)
    :param lower_percent: 低值拉伸比率
    :param higher_percent: 高值拉伸比率
    :return: 无返回参数,直接输出图片
    """
    print(imgPath)
    RGB_Array=readTif(imgPath)
    print(RGB_Array.shape)
    band_Num = RGB_Array.shape[2]           # 数组第三维度的大小,在这里是图像的通道数
    JPG_Array = np.zeros_like(RGB_Array, dtype=np.uint8)
    for i in range(band_Num):
        minValue = 0
        maxValue = 255
        #获取数组RGB_Array某个百分比分位上的值
        low_value = np.percentile(RGB_Array[:, :,i], lower_percent)
        high_value = np.percentile(RGB_Array[:, :,i], higher_percent)
        temp_value = minValue + (RGB_Array[:, :,i] - low_value) * (maxValue - minValue) / (high_value - low_value)
        temp_value[temp_value < minValue] = minValue
        temp_value[temp_value > maxValue] = maxValue
        JPG_Array[:, :, i] = temp_value
    outputImg = Image.fromarray(np.uint8(JPG_Array))
    outputImg.save(resultPath)

def Batch_Convert_tif_to_jpg(imgdir,savedir):
    #获取文件夹下所有tif文件名称,并存入列表
    file_name_list = os.listdir(imgdir)
    for name in file_name_list:
        # 获取图片文件全路径
        img_path = os.path.join(imgdir, name)
        #获取文件名,不包含扩展名
        filename = os.path.splitext(name)[0]
        print(filename)
        savefilename = filename + "_no" +".jpg"
        #文件存储全路径
        savepath = os.path.join(savedir, savefilename)
        # img_path为tif文件的完全路径
        # savepath为tif文件对应的jpg文件的完全路径
        print(savepath)
        stretchImg(img_path, savepath)
        print("图片:【", filename, "】完成转换")
    print("完成所有图片转换!")
    

if __name__ == '__main__':
    imgdir = r"C:\Users\admin\Desktop\prodata\process\tif"        # tif文件所在的【文件夹】
    savedir = r"C:\Users\admin\Desktop\prodata\process\jpg"   # 转为jpg后存储的【文件夹】
    Batch_Convert_tif_to_jpg(imgdir, savedir)
    
    

结果:

### 卫星遥感数据在虫害监测与分析中的应用 卫星遥感技术通过获取高分辨率的影像和多光谱数据,能够有效用于农业领域的虫害监测与分析。以下是其主要原理和技术实现方式: #### 数据采集 卫星遥感数据通常由搭载多种传感器的地球观测卫星收集,这些传感器可以捕捉可见光、近红外、短波红外以及热红外等多个波段的数据。对于虫害监测而言,重点在于利用植物冠层反射率的变化来判断健康状况。当作物受到虫害侵袭时,叶片的颜色、形状及结构会发生改变,这会直接影响到特定波段的反射特性[^2]。 #### 图像处理 获得原始遥感影像之后,需经过一系列预处理步骤以提高后续分析精度。主要包括辐射校正、大气校正、几何校正等过程。随后可采用增强算法突出显示受虫害影响区域,去除云层遮挡等因素干扰造成的噪声点。例如,在Python环境下借助GDAL库读取GeoTIFF文件执行基础运算非常便捷[^3]。 ```python from osgeo import gdal def load_raster(file_path): dataset = gdal.Open(file_path, gdal.GA_ReadOnly) band_data = [] for i in range(1, dataset.RasterCount + 1): band = dataset.GetRasterBand(i).ReadAsArray() band_data.append(band) return np.array(band_data) raster_array = load_raster('path_to_your_image.tif') ``` #### 数据分析 通过对不同时间段内的同一地点重复拍摄得到的时间序列图像进行对比研究,可以发现因虫害而导致植被指数下降的趋势。常用的NDVI(Normalized Difference Vegetation Index)公式如下所示,它能很好地反映绿色植被覆盖度变化情况[^1]: \[ \text{NDVI}=\frac{\rho_{\mathrm{nir}}-\rho_{\mathrm{red}}}{\rho_{\mathrm{nir}}+\rho_{\mathrm{red}}} \] 其中,\(\rho\)代表相应波段的地表反射率。\(^{}\) 此外,机器学习模型也被广泛应用于自动分类潜在受害区与其他正常生长状态区别开来的任务当中。训练集构建阶段需要标注好已知样本标签作为监督信号输入神经网络架构完成特征提取工作。 ---
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值