• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
SXANG
帮助2

一.前言:

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

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

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

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

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

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

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

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

学新通

  1.  
    import numpy as np
  2.  
    import os
  3.  
    from PIL import Image
  4.  
    from osgeo import gdal
  5.  
     
  6.  
    # Stop GDAL printing both warnings and errors to STDERR
  7.  
    gdal.PushErrorHandler('CPLQuietErrorHandler')
  8.  
     
  9.  
    # Make GDAL raise python exceptions for errors (warnings won't raise an exception)
  10.  
    gdal.UseExceptions()
  11.  
     
  12.  
     
  13.  
    def readTif(imgPath, bandsOrder=[3, 2, 1]):
  14.  
    """
  15.  
    读取GEO tif影像的前三个波段值,并按照R.G.B顺序存储到形状为【原长*原宽*3】的数组中
  16.  
    :param imgPath: 图像存储全路径
  17.  
    :param bandsOrder: RGB对应的波段顺序,如高分二号多光谱包含蓝,绿,红,近红外四个波段,RGB对应的波段为3,2,1
  18.  
    :return: R.G.B三维数组
  19.  
    """
  20.  
    dataset = gdal.Open(imgPath, gdal.GA_ReadOnly) # 返回一个gdal.Dataset类型的对象
  21.  
    cols = dataset.RasterXSize # tif图像的宽度
  22.  
    rows = dataset.RasterYSize # tif图像的高度
  23.  
    data = np.empty([rows, cols, 3], dtype=float) # 定义结果数组,将RGB三波段的矩阵存储
  24.  
    for i in range(3):
  25.  
    band = dataset.GetRasterBand(bandsOrder[i]) # 读取波段数值
  26.  
    oneband_data = band.ReadAsArray() # 读取波段数值读为numpy数组
  27.  
    #print(oneband_data)
  28.  
    data[:, :, i] = oneband_data # 将读取的结果存放在三维数组的一页三
  29.  
    return data
  30.  
     
  31.  
    def stretchImg(imgPath, resultPath, lower_percent=0.5, higher_percent=99.5):
  32.  
    """
  33.  
    #将光谱DN值映射至0-255,并保存
  34.  
    :param imgPath: 需要转换的tif影像路径(***.tif)
  35.  
    :param resultPath: 转换后的文件存储路径(***.jpg)
  36.  
    :param lower_percent: 低值拉伸比率
  37.  
    :param higher_percent: 高值拉伸比率
  38.  
    :return: 无返回参数,直接输出图片
  39.  
    """
  40.  
    print(imgPath)
  41.  
    RGB_Array=readTif(imgPath)
  42.  
    print(RGB_Array.shape)
  43.  
    band_Num = RGB_Array.shape[2] # 数组第三维度的大小,在这里是图像的通道数
  44.  
    JPG_Array = np.zeros_like(RGB_Array, dtype=np.uint8)
  45.  
    for i in range(band_Num):
  46.  
    minValue = 0
  47.  
    maxValue = 255
  48.  
    #获取数组RGB_Array某个百分比分位上的值
  49.  
    low_value = np.percentile(RGB_Array[:, :,i], lower_percent)
  50.  
    high_value = np.percentile(RGB_Array[:, :,i], higher_percent)
  51.  
    temp_value = minValue (RGB_Array[:, :,i] - low_value) * (maxValue - minValue) / (high_value - low_value)
  52.  
    temp_value[temp_value < minValue] = minValue
  53.  
    temp_value[temp_value > maxValue] = maxValue
  54.  
    JPG_Array[:, :, i] = temp_value
  55.  
    outputImg = Image.fromarray(np.uint8(JPG_Array))
  56.  
    outputImg.save(resultPath)
  57.  
     
  58.  
    def Batch_Convert_tif_to_jpg(imgdir,savedir):
  59.  
    #获取文件夹下所有tif文件名称,并存入列表
  60.  
    file_name_list = os.listdir(imgdir)
  61.  
    for name in file_name_list:
  62.  
    # 获取图片文件全路径
  63.  
    img_path = os.path.join(imgdir, name)
  64.  
    #获取文件名,不包含扩展名
  65.  
    filename = os.path.splitext(name)[0]
  66.  
    print(filename)
  67.  
    savefilename = filename "_no" ".jpg"
  68.  
    #文件存储全路径
  69.  
    savepath = os.path.join(savedir, savefilename)
  70.  
    # img_path为tif文件的完全路径
  71.  
    # savepath为tif文件对应的jpg文件的完全路径
  72.  
    print(savepath)
  73.  
    stretchImg(img_path, savepath)
  74.  
    print("图片:【", filename, "】完成转换")
  75.  
    print("完成所有图片转换!")
  76.  
     
  77.  
     
  78.  
    if __name__ == '__main__':
  79.  
    imgdir = r"C:\Users\admin\Desktop\prodata\process\tif" # tif文件所在的【文件夹】
  80.  
    savedir = r"C:\Users\admin\Desktop\prodata\process\jpg" # 转为jpg后存储的【文件夹】
  81.  
    Batch_Convert_tif_to_jpg(imgdir, savedir)
  82.  
     
  83.  
     
学新通

结果:

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiagkjj
系列文章
更多 icon
同类精品
更多 icon
继续加载