(Python)使用Gdal进行批量的多光谱影像波段合成

2023-05-16

(Python)使用Gdal进行批量的多光谱影像波段合成

文章目录

  • (Python)使用Gdal进行批量的多光谱影像波段合成
    • 摘要
    • 方法
      • 代码介绍
      • 完整代码
    • 实验结果
      • 代码运行结果(部分)
      • 多光谱合成结果
      • 耗时

摘要

项目中经常遇到批量多光谱合成的任务需求,数量不多时,可以利用ENVI、ARCGIS等软件进行手工操作,但是当遇到数据量大且数据名称类似的任务时,很容易陷入机械劳动,耗时且易出错。

本文提供了个人学习科研进行中,撰写的批量多光谱合成代码。其可以按照合成对象的命名特点搜索文件中的待合成波段的影像列表,并使用Gdal完成简单的波段合成,最后使用Envi检验合成结果。

方法

代码介绍

代码主要分为两个函数:

  1. 自动获待要合成的影像名称和地址。
  2. 进行合成图像的创建与多波段的合成。

完整代码

#载入相关库
import os
import re
from osgeo import gdal
import numpy as np

'''
功能:从图中找到要波段融合的影像,然后合成为一个波段(可做批处理)
函数构成:
        1.自动获取待合成的图像名称和地址。
        2.进行图像的创建与多波段的合成。
作者:卫少东
单位:WHU
时间:20211109
'''

def getImageList(image_dir,out_dir,image):
    """
    获取相关待合成的多光谱影像地址列表
    :param image_dir: 影像文件所在文件夹
    :param out_dir: 输出文件夹
    :param image: 待寻找文件名称的正则项
    :return: 创建好的文件列表地址
    """
    image_name = re.compile(image)
    dirPath = image_dir#影像们所在的总目录,也即是遍历进行的目录
    str_size = len(image_name_list[0])
    result_file = out_dir+'\\'+image[0:25]+image[str_size-11:str_size-1]+ r'.txt'#这里按照自己影像的命名规则改变
    fresult_file = open(result_file, 'w')  # 创建影像列表文件
    for root, dirs, files in os.walk(dirPath):
        if files:
            for file in files:
                mo = image_name.search(file)
                if mo:
                    print((root + '\\' + file))
                    fresult_file.write((root + '\\' + file + '\n'))
    print("image list created.")
    return result_file

def SynthesisBands(dstlist,outfile_dir):
    """
    将多光谱波段合成一个tif
    :param dstlist: 输入待合成文件的列表
    :param outfile_dir: 影像的输出文件夹
    """
    image_dst_list = np.loadtxt(dst_list, 'str')
    dataset_init = gdal.Open(image_dst_list[0])
    #创建待输出的图
    gtiff_driver = gdal.GetDriverByName('GTiff')
    dst_name = outfile_dir+ dstlist[dstlist.rfind('\\'):dstlist.rfind('x')] + 'if'#从后往前找第一个"\"注意要用双\\表示
    out_ds = gtiff_driver.Create(dst_name, dataset_init.RasterXSize, dataset_init.RasterYSize, 4)#本文合成的对象是4个波段,按照自己的需要改变
    out_ds.SetProjection(dataset_init.GetProjection())
    out_ds.SetGeoTransform(dataset_init.GetGeoTransform())#获得原始波段的地理信息
    #往图中填各波段
    for i in range(len(image_dst_list)):
        dataset = gdal.Open(image_dst_list[i])
        band_temp = dataset.GetRasterBand(1)
        out_ds.GetRasterBand(1+i).WriteArray(band_temp.ReadAsArray())#注意band从1开始,所以要加一
    del out_ds
    print("the bands systhesised to one tif.")


bands_name = [6,8,14,28] #共四个波段
image_name_list = [r'HHZ3_20201114005237_0007_L1B_B\d\d_CMOS2_ortho',
                   r'HHZ3_20201114005237_0008_L1B_B\d\d_CMOS2_ortho',
                   r'HHZ3_20201114005237_0009_L1B_B\d\d_CMOS2_ortho',
                   r'HHZ3_20201114005237_0010_L1B_B\d\d_CMOS1_ortho',
                   r'HHZ3_20201114005237_0010_L1B_B\d\d_CMOS3_ortho',
                   r'HHZ3_20201114005237_0011_L1B_B\d\d_CMOS1_ortho',
                   r'HHZ3_20201114005237_0011_L1B_B\d\d_CMOS3_ortho'] #这里是正确搜索影像文件名称的正则表达式,需要按照自己的改变
image_dir ="D:\欧比特\欧比特ortho"
out_dir = r'D:\欧比特\欧比特ortho\res'
for name in image_name_list:
    dst_list = getImageList(image_dir, out_dir, name)
    SynthesisBands(dst_list, out_dir)
print("Patch synthesis done.")

实验结果

代码运行结果(部分)

D:\欧比特\欧比特ortho\ortho6\HHZ3_20201114005237_0011_L1B_B06_CMOS3_ortho.tif
D:\欧比特\欧比特ortho\ortho8\HHZ3_20201114005237_0011_L1B_B08_CMOS3_ortho.tif
D:\欧比特\欧比特ortho\ortho14\HHZ3_20201114005237_0011_L1B_B14_CMOS3_ortho.tif
D:\欧比特\欧比特ortho\ortho28\HHZ3_20201114005237_0011_L1B_B28_CMOS3_ortho.tif
image list created.
the bands systhesised to one tif.
Patch synthesis done.

多光谱合成结果

耗时

在商务本ThinkpadX1上,合成一组四张6000*6000左右大小的影像张耗时约3秒。

如需进一步交流,个人联系方式:WHUwsd1995(weixin)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Python)使用Gdal进行批量的多光谱影像波段合成 的相关文章

随机推荐

  • 植保无人机航线规划

    最近折腾了植保无人机航线规划的算法 支持任意多边形 不包括自相交多边形 的边界及障碍区域 其中涉及到了多边形内缩外扩 多边形的分解 多边形交集 并集 差集 深度优先搜索 最短路径算法 耗时两个多月 用C 实现整套算法 生成的库在missio
  • 现代控制工程笔记(一)控制系统的状态空间描述

    文章目录 1 基本概念2 系统的状态空间描述状态空间描述框图状态变量选取的非唯一性 3 由系统微分方程列写状态空间表达式一 微分方程中不包含输入函数的导数项相变量法其他方法 xff1a 二 微分方程中包含输入函数的导数项 4 由传递函数列写
  • 百度Apollo 2.0 车辆控制算法之LQR控制算法解读

    百度Apollo 2 0 车辆控制算法之LQR控制算法解读 Apollo 中横向控制的LQR控制算法在Latcontroller cc 中实现 根据车辆的二自由度动力学模型 1 根据魔术公式在小角度偏角的情况下有 轮胎的侧向力与轮胎的偏离角
  • 多传感器融合--MATLAB跟踪器介绍

    多传感器融合 MATLAB跟踪器介绍 MATLAB通过多目标跟踪器可以融合多传感器检测到的目标信息 xff0c 常用到的多目标跟踪器有trackerGNN trackerJPDA trackerTOMHT trackerPHD等 track
  • MATLAB多传感器融合--核心步骤

    MATLAB多传感器融合 核心步骤 MATLAB的多传感器融合的核心步骤在stepImpl函数中实现 xff0c 该函数的输入的跟踪目标和测量的目标的信息 xff0c 输出为证实的真目标信息和处于试探的跟踪目标信息 confirmedTra
  • [新手编译内核]kernel进行编译时提示No rule to make target `menconfig'.

    windows下下载了 linux 2 6 37内核源码 xff0c 拷贝到U盘上 xff0c 通过mount挂载到了虚拟机里的Centos 5 5系统上 通过putty使用host only方式连接到虚拟机 xff0c 进行操作 在 mn
  • 协议和协议栈的区别?

    在通信领域特别是无线通信领域 xff0c 我们经常会听到用到什么协议啊 xff0c 什么协议栈方面的东西 1 首先 xff0c 协议定义的是一些列的通信标注 xff0c 通信的双方需要共同按照这一个标准进行正常的数据收发 xff1b 在计算
  • linux-kernel, bus总线数据结构分析

    设备模型中的三大组件是 xff1a 总线 xff0c 驱动 xff0c 设备 bus driver device 数据结构总览 总线除了一些物理总线的抽象 xff0c 还代表一些虚拟的总线 xff0c 如platform xff0c 所以在
  • JavaScript 猜数字小游戏

    说明 单独创建一个js文件 然后在文件里面写入下列代码 之后在html页面引入该js文件即可 span class token comment 设计并实现 猜数游戏 xff0c 并输出每轮猜数游戏的猜测次数 游戏规则如下 xff1a spa
  • 纯干货:LCD屏和OLED屏的区别?手机屏幕材质各有什么区别?

    纯干货 xff1a LCD屏和OLED屏的区别 xff1f 手机屏幕材质各有什么区别 xff1f 慢慢买比价 已认证的官方帐号 74 人赞同了该文章 今天我就为大家带来一篇纯干货知识点整理 xff0c 关于手机屏幕那点事看完秒懂 以及大家对
  • OpenJDK在OpenHarmony上异常问题分析

    目录 0 前言1 问题日志打印2 报错日志代码分析3 问题解决方案 0 前言 基于OpenHarmony的2022 06 30 master之前版本OpenJDK测试OK xff0c 但是之后版本测试报异常错误 1 问题日志打印 2 报错日
  • vnc viewer远程连接xfce桌面无法打开terminal终端

    这是因为默认的terminal错啦 xff0c 改一下就好 在页面左上角上找到 Appication gt Settings gt Settings Manager gt Preferred Applications gt Utilitie
  • ucosii第一章读书笔记

    第一章 嵌入式操作系统 1 1 计算机操作系统 简介 xff1a 嵌入式操作系统属于操作系统的一种 嵌入式操作系统的概念 xff1a 应用于嵌入式系统的操作系统叫做嵌入式操作系统 操作系统的概念 xff1a 是一种系统软件 作用于硬件和应用
  • ceres中的loss函数实现探查,包括Huber,Cauchy,Tolerant图像实现及源码

    ceres中的loss函数实现探查 xff0c 包括Huber xff0c Cauchy xff0c Tolerant图像实现及源码 各个损失函数的趋势图 xff1a Ceres内嵌的loss functions原理 xff1a 以Cauc
  • 使用自己的INDEMIND相机来运行ORBSLAM2单目,双目和深度模式(小觅相机和realsense通用)

    流程一览 配置ROSROS环境准备 以 xff11 6 04 ROS Kinetic为例 创建自己的工作空间 配置ORBSLAM编译ORBSLAM2 ROS常见错误及解决运行build ros sh时出现问题一 运行build ros sh
  • 超详细中文车牌识别开源库EasyPR入门实战(win10_VS2019_opencv34)

    中文车牌识别库EasyPR配置全过程及编译问题解决 xff08 win10 VS2019 opencv34 xff09 本文目录 中文车牌识别库EasyPR配置全过程及编译问题解决 xff08 win10 VS2019 opencv34 x
  • (Python)使用Gdal+opencv读遥感影像加简单处理

    文章目录 简介代码运行结果 简介 使用Python API的gdal和opencv一般遇到最大的问题就是 xff0c 遥感影像一般为16位和opencv只处理8位 xff0c 中间的转换有很多的写的非常复杂又不完全对的 xff0c 本文提供
  • (Python)Gdal与Opencv遥感影像Sift匹配+RANSAC筛选并计算匹配RMSE精度

    目录 简要介绍代码运行结果 简要介绍 SIFT xff0c 即尺度不变特征变换 xff08 Scale invariant feature transform xff0c SIFT xff09 xff0c 是用于图像处理领域的一种描述 这种
  • (Python)使用Gdal进行批量的影像RPC正射校正

    使用Python 43 Gdal进行批量的影像RPC正射校正 文章目录 使用Python 43 Gdal进行批量的影像RPC正射校正摘要方法实验数据 实现代码介绍完整代码 实验结果代码运行结果正射校正结果性能 摘要 遥感影像经常会遇到大批量
  • (Python)使用Gdal进行批量的多光谱影像波段合成

    xff08 Python xff09 使用Gdal进行批量的多光谱影像波段合成 文章目录 xff08 Python xff09 使用Gdal进行批量的多光谱影像波段合成摘要方法代码介绍完整代码 实验结果代码运行结果 xff08 部分 xff