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

一.前言:

        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]这个区间

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

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)
    
    

结果:

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

你可能感兴趣的:(库的学习,python)