python随笔一:tif图片波段分离

该代码示例展示了如何使用Python和GDAL库将多波段遥感影像拆分成单波段图像。通过读取TIFF文件,提取波段并分别保存为单独的TIFF文件。过程包括读取影像、获取投影和地理信息、以及写入新文件。
部署运行你感兴趣的模型镜像
"""
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|使用Python实现遥感图像的波段分离 - Weltㅤ - 博客园 (cnblogs.com)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值