Python高光谱遥感影像处理问题详细分析讲解

目录
  • 前言
  • 1.波段合并
  • 2.波段拆分
  • 3.影像裁剪
  • 4.批量影像裁剪

前言

在写波段配准相关代码时经常需要用到tif影像的波段合成和分解,虽然可以用ENVI才处理,但是每次都要打开再设置一些参数有些麻烦,所以本着“独立自主、自力更生”的原则就写了些脚本来处理这个需求。又写了个批量裁剪影像的脚本。这里简单总结归纳一下。

1.波段合并

# coding=utf-8
import sys
import cv2
import functions as fun
import os
if __name__ == '__main__':
    if sys.argv.__len__() >= 2:
        if sys.argv[1] == 'help' or sys.argv[1] == 'HELP':
            print("Function description:")
            print("Join several bands into one file.")
            print("\nUsage instruction:")
            print("example.exe [img_dir] [img_type] [out_path]")
            print("[img_dir]:The input dir that contains band data.")
            print("[img_type]:The file type of band data,tif or png etc.")
            print("[out_path]:The filename of joined image.")
            print("Please note that these band data should have same height and width.")
            print("\nUsage example:")
            print("Tool_JoinBands.exe C:\\tif tif C:\\tifout\\joined.tif")
            os.system('pause')
        else:
            img_dir = sys.argv[1]
            img_type = sys.argv[2]
            out_path = sys.argv[3]
            paths, names, files = fun.findAllFiles(img_dir, img_type)
            bands_data = []
            # 对于tif文件,统一用gdal打开并输出为tif文件
            if img_type.endswith('tif') or img_type.endswith('TIF') or img_type.endswith('TIFF') or img_type.endswith(
                    'tiff'):
                for i in range(files.__len__()):
                    band_data = fun.readTifImage(files[i])
                    bands_data.extend(band_data)
                    print("joined " + (i + 1).__str__() + " bands.")
                print(bands_data.__len__().__str__() + " bands in total.")
                fun.writeTif(bands_data, out_path)
            # 对于所有其它类型的文件,如jpg、png等,统一用OpenCV处理
            else:
                for i in range(files.__len__()):
                    band_data = cv2.imread(files[i], cv2.IMREAD_GRAYSCALE)
                    bands_data.append(band_data)
                print("Open image success.")
                data = cv2.merge((bands_data[0], bands_data[1], bands_data[2]))
                cv2.imwrite(out_path, data)
                print("Save image success.")
    else:
        print("Unknown mode, input 'yourExeName.exe help' to get help information.")

这里简单介绍下代码。经过波段配准后,不同波段的影像已经实现了对齐,所以通过读取各波段影像然后利用GDAL叠加即可。

2.波段拆分

# coding=utf-8
import sys
import os
import cv2
import functions as fun
if __name__ == '__main__':
    if sys.argv.__len__() >= 2:
        if sys.argv[1] == 'help' or sys.argv[1] == 'HELP':
            print("Function description:")
            print("Separate and save different band data in one image file.")
            print("\nUsage instruction:")
            print("example.exe [img_path] [out_dir]")
            print("[img_path]:The filename of input image.")
            print("[output_dir]:The output dir for different band images.")
            print("\nUsage example:")
            print("Tool_SeparateBands.exe C:\\tif\\input.tif C:\\tifout")
            os.system('pause')
        else:
            img_path = sys.argv[1]
            output_dir = sys.argv[2]
            # 对于tif文件,统一用gdal打开并输出为tif文件
            if img_path.endswith('tif') or img_path.endswith('TIF') or img_path.endswith('TIFF') or img_path.endswith(
                    'tiff'):
                bands_data = fun.readTifImage(img_path)
                for i in range(bands_data.__len__()):
                    fun.writeTif([bands_data[i]], output_dir + os.path.sep + "band_" + i.__str__().zfill(2) + ".tif")
                    print("saved " + (i + 1).__str__() + "/" + bands_data.__len__().__str__())
            # 对于所有其它类型的文件,如jpg、png等,统一用OpenCV处理
            else:
                img = cv2.imread(img_path)
                print("Open image success.")
                band_b, band_g, band_r = cv2.split(img)
                cv2.imwrite(output_dir + os.path.sep + "band_b.png", band_b)
                cv2.imwrite(output_dir + os.path.sep + "band_g.png", band_g)
                cv2.imwrite(output_dir + os.path.sep + "band_r.png", band_r)
                print("Save image success.")
    else:
        print("Unknown mode, input 'yourExeName.exe help' to get help information.")

波段拆分与波段合并相反,直接读取一个多波段的tif影像,然后依次保存各波段数据为单独文件即可。

3.影像裁剪

在之前,要想实现影像裁剪的功能需要借助ENVI等软件,但是ENVI等打开比较慢,还要各种设置,比较麻烦。所以直接写了个脚本来方便地实现功能

# coding=utf-8
import sys
import cv2
import functions as fun
import os
if __name__ == '__main__':
    if sys.argv.__len__() >= 2:
        if sys.argv[1] == 'help' or sys.argv[1] == 'HELP':
            print("Function description:")
            print("Select and cut the ROI(region of interest) in a big image file.")
            print("\nUsage instruction:")
            print("example.exe [img_path] [out_path] [start_x] [start_y] [x_range] [y_range]")
            print("[img_path]:The filename of input image.")
            print("[out_path]:The filename of output image.")
            print("[start_x]:The x coordinate of ROI's left-top point in big image.")
            print("[start_y]:The y coordinate of ROI's left-top point in big image.")
            print("[x_range]:The range of ROI in x direction(width).")
            print("[y_range]:The range of ROI in y direction(height).")
            print("\nUsage example:")
            print("Tool_ResizeIMG.exe C:\\tif\\input.tif C:\\tifout\\roi.tif 100 200 3000 4000")
            os.system('pause')
        else:
            img_path = sys.argv[1]
            out_path = sys.argv[2]
            start_x = int(sys.argv[3])
            start_y = int(sys.argv[4])
            x_range = int(sys.argv[5])
            y_range = int(sys.argv[6])
            # 对于tif文件,统一用gdal打开并输出为tif文件
            if img_path.endswith('tif') or img_path.endswith('TIF') or img_path.endswith('TIFF') or img_path.endswith(
                    'tiff'):
                bands_data = fun.readTifImageWithWindow(img_path, start_x, start_y, x_range, y_range)
                fun.writeTif(bands_data, out_path)
            # 对于所有其它类型的文件,如jpg、png等,统一用OpenCV处理
            else:
                bands_data = cv2.imread(img_path)
                print("Open image success.")
                bands_data_roi = bands_data[start_y:start_y + y_range, start_x:start_x + x_range, :]
                cv2.imwrite(out_path, bands_data_roi)
                print("Save image success.")
    else:
        print("Unknown mode, input 'yourExeName.exe help' to get help information.")

影像裁剪实现也相对简单,就是通过设置读取影像范围即可实现对指定区域的裁剪。

4.批量影像裁剪

# coding=utf-8
import sys
import cv2
import functions as fun
import os
if __name__ == '__main__':
    if sys.argv.__len__() >= 2:
        if sys.argv[1] == 'help' or sys.argv[1] == 'HELP':
            print("Function description:")
            print("Select and cut the ROI(region of interest) in big image files(Batch mode).")
            print("\nUsage instruction:")
            print("example.exe [img_dir] [img_type] [output_dir] [start_x] [start_y] [x_range] [y_range]")
            print("[img_dir]:The input dir that contains band data.")
            print("[img_type]:The file type of band data,tif or png etc.")
            print("[output_dir]:The output dir for ROI images.")
            print("[start_x]:The x coordinate of ROI's left-top point in big image.")
            print("[start_y]:The y coordinate of ROI's left-top point in big image.")
            print("[x_range]:The range of ROI in x direction(width).")
            print("[y_range]:The range of ROI in y direction(height).")
            print("\nUsage example:")
            print("Tool_ResizeIMG_Batch.exe C:\\tif tif C:\\tifout 100 200 3000 4000")
            os.system('pause')
        else:
            img_dir = sys.argv[1]
            img_type = sys.argv[2]
            out_dir = sys.argv[3]
            start_x = int(sys.argv[4])
            start_y = int(sys.argv[5])
            x_range = int(sys.argv[6])
            y_range = int(sys.argv[7])
            paths, names, files = fun.findAllFiles(img_dir, img_type)
            # 对于tif文件,统一用gdal打开并输出为tif文件
            if img_type.endswith('tif') or img_type.endswith('TIF') or img_type.endswith('TIFF') or img_type.endswith(
                    'tiff'):
                for i in range(files.__len__()):
                    bands_data = fun.readTifImageWithWindow(files[i], start_x, start_y, x_range, y_range)
                    fun.writeTif(bands_data, out_dir + os.path.sep + names[i][:names[i].rfind('.')] + "_cut.tif")
                    print("cutting " + (i + 1).__str__() + "/" + files.__len__().__str__())
                print('cut finished.')
            # 对于所有其它类型的文件,如jpg、png等,统一用OpenCV处理
            else:
                for i in range(files.__len__()):
                    bands_data = cv2.imread(files[i])
                    bands_data_roi = bands_data[start_y:start_y + y_range, start_x:start_x + x_range, :]
                    cv2.imwrite(out_dir + os.path.sep + "band_" + (i + 1).__str__().zfill(2) + ".jpg", bands_data_roi)
                    print("cutting " + (i + 1).__str__() + "/" + files.__len__())
                print('cut finished.')
    else:
        print("Unknown mode, input 'yourExeName.exe help' to get help information.")

相比于单张影像裁剪,批量裁剪就是多加了个循环,实现了批量操作,也比较简单。

到此这篇关于Python高光谱遥感影像处理问题详细分析讲解的文章就介绍到这了,更多相关Python高光谱遥感影像处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 实现遥感影像波段组合的示例代码

    最近要做个遥感相关的小系统,需要波段组合功能,网上找了可以使用ArcGIS安装时自带的arcpy包,但是Python3.7不能使用现有ArcGIS10.2版本,也不想再装其他版本,所以只能自己想了个办法解决.不过有点笨啊. 思路是: 1.读取需要组合遥感影像波段(此处用OLI) 2.创建数组,把读取的波段按序放进去 3.写入文件,写成tif多波段数据 上代码: from osgeo import gdal import os import numpy as np class GRID: #读图像

  • Python中使用OpenCV库来进行简单的气象学遥感影像计算

    OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用.OpenCV可用于开发实时的图像处理.计算机视觉以及模式识别程序.该程序库也可以使用英特尔公司的IPP进行加速处理. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python, Java and MATLAB/OCTAVE

  • 利用python GDAL库读写geotiff格式的遥感影像方法

    如下所示: from osgeo import gdal import numpy as np def read_tiff(inpath): ds=gdal.Open(inpath) row=ds.RasterXSize col=ds.RasterYSize band=ds.RasterCount geoTransform=ds.GetTransform() proj=ds.GetTransform() data=np.zeros([row,col,band]) for i in range(b

  • 详解Python修复遥感影像条带的两种方式

    GDAL修复Landsat ETM+影像条带 Landsat7 ETM+卫星影像由于卫星传感器故障,导致此后获取的影像出现了条带.如下图所示, 影像中均匀的布满条带. 使用GDAL修复影像条带的代码如下: def gdal_repair(tif_name, out_name, bands): """ tif_name(string): 源影像名 out_name(string): 输出影像名 bands(integer): 影像波段数 """ #

  • Python高光谱遥感影像处理问题详细分析讲解

    目录 前言 1.波段合并 2.波段拆分 3.影像裁剪 4.批量影像裁剪 前言 在写波段配准相关代码时经常需要用到tif影像的波段合成和分解,虽然可以用ENVI才处理,但是每次都要打开再设置一些参数有些麻烦,所以本着“独立自主.自力更生”的原则就写了些脚本来处理这个需求.又写了个批量裁剪影像的脚本.这里简单总结归纳一下. 1.波段合并 # coding=utf-8 import sys import cv2 import functions as fun import os if __name__

  • C语言详细分析讲解内存管理malloc realloc free calloc函数的使用

    目录 C语言内存管理 一.动态空间申请 二.动态空间的扩容 三.释放内存 C语言内存管理 malloc && realloc && free && calloc c语言中为了进行动态内存管理,<stdlib.h>中提供了几个函数帮助进行内存管理. 我们知道,C语言中是没有C++中的容器或者说是python中list,set这些高级的数据结构的,我们一旦申请了一段内存空间以后这一段空间就归你了,比如我们举个例子,我们申请一个数组 int nums[

  • python的变量与赋值详细分析

    python的变量与赋值 1.变量的命名规则 变量其实通过一个标记调用内存中的值,而变量名就是这个标记的名称,但是万一这个标记已经被提前占用或者解释器认为这个标记是不合法的,那么就会报错.下面总结了一下变量的命名规则: 1.不能使用python的关键字,也就是说标记不能被提前占用,python的关键字包括: ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', '

  • Java 栈与队列超详细分析讲解

    目录 一.栈(Stack) 1.什么是栈? 2.栈的常见方法 3.自己实现一个栈(底层用一个数组实现) 二.队列(Queue) 1.什么是队列? 2.队列的常见方法 3.队列的实现(单链表实现) 4.循环队列 一.栈(Stack) 1.什么是栈? 栈其实就是一种数据结构 - 先进后出(先入栈的数据后出来,最先入栈的数据会被压入栈底) 什么是java虚拟机栈? java虚拟机栈只是JVM当中的一块内存,该内存一般用来存放 例如:局部变量当调用函数时,我们会为函数开辟一块内存,叫做 栈帧,在 jav

  • C语言详细分析讲解struct与union使用方法

    目录 一.struct 的小秘密 二.结构体与柔性数组 三.C语言中的 union 四.小结 一.struct 的小秘密 C语言中的 struct 可以看作变量的集合 struct 的问题:空结构体占用多大内存?下面编写程序看一下吧: #include <stdio.h> struct TS { }; int main() { struct TS t1; struct TS t2; printf("sizeof(struct TS) = %d\n", sizeof(stru

  • C++详细分析讲解函数参数的扩展

    目录 一.函数参数的默认值 二.函数占位参数 三.小结 一.函数参数的默认值 C++ 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的默认值必须在函数声明中指定 下面看一段代码: #include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("%d\n", mul()); printf("%d\n", mul(-1

  • C语言详细分析讲解多文件的程序设计

    目录 一.多文件与编译器链接 二.多文件之间的相互访问 三.关于#include 四.头文件使用的一些原则 五.再论全局变量 六.注意事项 七.实验程序 八.小结 一.多文件与编译器链接 如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件. 二.多文件之间的相互访问 每个文件可以定义功能接口(可被其它文件访问的函数或数据) 源文件:代码实现文件,后缀为.c 头文件:源文件的接口定义文件,后缀为.h 当需要使用其它文件提供的功能时,包含对应的头文件 语法: #in

  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    目录 一.枚举类型的使用方法 二.sizeof 关键字的用法 三.typedef 的意义 四.小结 一.枚举类型的使用方法 enum 是 C 语言中的一种自定义类型 enum 值是可以根据需要自定义的整型值 第一个定义的 enum 值默认为 0 默认情况下的 enum 值是在前一个定义值的基础上加 1 enum 类型的变量只能取定义时的离散值 enum 中定义的值是C语言中真正意义上的常量 在工程中 enum 多用于定义整型常量 下面看一段 enum 的使用代码吧: #include<stdio

  • C语言详细分析讲解关键字const与volatile的用法

    目录 一.const 只读变量 二.const 全局变量的分歧 三.const 的本质 四.const 修饰函数参数和返回值 五.volatile 解析 六.小结 一.const 只读变量 const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在全局数据区分配空间 const 只在编译期有用,在运行期无用 const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. 二.const 全局变量的分歧 在现代C语言编

  • C语言详细分析讲解关键字goto与void的作用

    目录 一.关于goto 二.void 的意义 三.小结 一.关于goto 高手潜规则:禁用 goto 项目经验:程序质量与 goto 的出现次数成反比 最后的判决:将 goto 打入冷宫 下面看一段 goto 副作用分析的代码: #include <stdio.h> #include <malloc.h> void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof

随机推荐