怎么读取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]这个区间
-
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)
-
-
结果:
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiagkjj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22