"""
time: 2022-7-23
coder: welt
reference:
将多波段遥感影像拆分为多张单波段图像
"""
import numpy as np
import os
from osgeo import gdal
import tqdm
"""
有很多的gdal包,如果直接import不行的话那么就可以通过 from osgeo import gdal等代码来进行导入,可能也可以的
"""
def readTiff(filename):
"""
:param filename:fileName
:return: 读取的图像像素矩阵,投影信息,地理坐标信息
这些def函数里面的大部分都不需要改,直接调用就可以了,这一段里面的内容就是调用栅格的属性
"""
dataset = gdal.Open(filename)#读取影像
width = dataset.RasterXSize#获取影像宽度
height = dataset.RasterYSize#获取影像高度
proj = dataset.GetProjection()# 获取图像投影信息(坐标系)
geotrans = dataset.GetGeoTransform()
'''GetGeoTransform()获取图像的几何变换信息,包括平移、旋转和缩放;影像左上角横坐标:geoTransform[0],影像左上角纵坐标:geoTransform[3],水平空间分辨率为geoTransform[1],
垂直空间分辨率为geoTransform[5],通常geoTransform[5] 与 geoTransform[1]相等;如果遥感影像方向没有发生旋转,即上北、下南,则
geoTransform[2] 与 row *geoTransform[4] 为零'''
gdal_img_data = dataset.ReadAsArray(0, 0, width, height)#读取该影像的像素矩阵
return gdal_img_data, proj, geotrans#返回数组,投影信息,几何转换信息
# 保存tif文件函数
def writeTiff(im_data, im_geotrans, im_proj, savepath):
"""
:param im_data: 需要保存的图像像素矩阵
:param im_geotrans: 地理坐标信息
:param im_proj: 投影信息
:param savepath: 文件保存路径
"""
if 'int8' in im_data.dtype.name:#判断数据类型
datatype = gdal.GDT_Byte#数据类型
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
if len(im_data.shape) == 3:#判断数据形状
im_bands, im_height, im_width = im_data.shape#返回数据波段数、高度、宽度
elif len(im_data.shape) == 2:
im_data = np.array([im_data])
im_bands, im_height, im_width = im_data.shape
# 创建文件
driver = gdal.GetDriverByName("GTiff")#定义图像格式类型(这里是tiff) # 创建一个新的tiff格式的文件,设置图像的宽度、高度、像素波段数、数据类型
dataset = driver.Create(savepath, int(im_width), int(im_height), int(im_bands), datatype)#写入图像的几何变换信息,包括平移、旋转和缩放
if dataset is not None:#如果数据存在
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) ## 写入图像的投影信息(坐标系)
for i in range(im_bands):#遍历波段
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])# 写入像素矩阵数据
del dataset
def band_separate(path_in, path_out):
"""
:param path_in: 要分离波段的原始图像数据名称
:param path_out: 分离的各波段结果图像部分名称
"""
img, proj, geotrans = readTiff(path_in)# 读取原始图像数据
# 依次将各波段输出
for i in tqdm.trange(img.shape[0]):#遍历各个波段
img_out = np.array(img[i, ::])# 读取每个波段的数组
# 输出波段的名称命名格式可以修改,结合传递的path2参数
# 保存tiff格式文件数据,前面两个def定义的函数在后面都通过def一步一步调用出来,这样才能够进一步的使用,之后最后通过band_separate这个参数调用前面的所有的函数,之后输出
writeTiff(img_out, geotrans, proj, path_out + str(i) + '.tif') # 输出波段的名称命名格式可以修改,结合传递的path2参数
if __name__ == '__main__':
#只需要在这里根据需要的路径改变具体的path in path on 这些参数就可以运行了
pathin = r'C:\00zml\code\0324\ndvi\2.tiff' # 要分离波段的原始图像数据名称
pathout = os.path.splitext(pathin)[0]#根据pathin输入数据找到根目录
band_separate(pathin, pathout)#运行函数
print('Band separate END!')#最终打印输出完成
第一次用python的代码运行gis,发现自己确实有很多的东西都不懂,也有很多的基础知识还需要进一步的了解,后面进一步进行了解。
该代码示例展示了如何使用Python和GDAL库将多波段遥感影像拆分成单波段图像。通过读取TIFF文件,提取波段并分别保存为单独的TIFF文件。过程包括读取影像、获取投影和地理信息、以及写入新文件。
562

被折叠的 条评论
为什么被折叠?



