前言

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

1.波段合并

# coding=utf-8
import sys
import cv2
import functions as fun
import osif __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 funif __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 osif __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 osif __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.")

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

5.模块functions如下:

functions.py

# coding=utf-8
import os
import cv2
import numpy as np
from osgeo import gdal
from gdalconst import *def readTifImage(img_path):data = []# 以只读方式打开遥感影像dataset = gdal.Open(img_path, GA_ReadOnly)if dataset is None:print("Unable to open image file.")return dataelse:print("Open image file success.")bands_num = dataset.RasterCountprint("Image height:" + dataset.RasterYSize.__str__() + " Image width:" + dataset.RasterXSize.__str__())print(bands_num.__str__() + " bands in total.")for i in range(bands_num):# 获取影像的第i+1个波段band_i = dataset.GetRasterBand(i + 1)# 读取第i+1个波段数据band_data = band_i.ReadAsArray(0, 0, band_i.XSize, band_i.YSize)data.append(band_data)print("band " + (i + 1).__str__() + " read success.")return datadef writeTif(bands, path):if bands is None or bands.__len__() == 0:returnelse:# 认为各波段大小相等,所以以第一波段信息作为保存band1 = bands[0]# 设置影像保存大小、波段数img_width = band1.shape[1]img_height = band1.shape[0]num_bands = bands.__len__()# 设置保存影像的数据类型if 'int8' in band1.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in band1.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32# 创建文件driver = gdal.GetDriverByName("GTiff")dataset = driver.Create(path, img_width, img_height, num_bands, datatype)if dataset is not None:for i in range(bands.__len__()):dataset.GetRasterBand(i + 1).WriteArray(bands[i])print("save image success.")def readTifImageWithWindow(img_path, start_x, start_y, x_range, y_range):data = []# 以只读方式打开遥感影像dataset = gdal.Open(img_path, GA_ReadOnly)if dataset is None:print("Unable to open image file.")return dataelse:print("Open image file success.")bands_num = dataset.RasterCountprint("Image height:" + dataset.RasterYSize.__str__() + " Image width:" + dataset.RasterXSize.__str__())print(bands_num.__str__() + " bands in total.")for i in range(bands_num):# 获取影像的第i+1个波段band_i = dataset.GetRasterBand(i + 1)# 读取第i+1个波段数据band_data = band_i.ReadAsArray(start_x, start_y, x_range, y_range)data.append(band_data)print("band " + (i + 1).__str__() + " read success.")return datadef findAllFiles(root_dir, filter):print("Finding files ends with \'" + filter + "\' ...")separator = os.path.seppaths = []names = []files = []# 遍历for parent, dirname, filenames in os.walk(root_dir):for filename in filenames:if filename.endswith(filter):paths.append(parent + separator)names.append(filename)for i in range(paths.__len__()):files.append(paths[i] + names[i])print (names.__len__().__str__() + " files have been found.")paths.sort()names.sort()files.sort()return paths, names, 

基于Python高光谱遥感影像处理实例相关推荐

  1. python基于水色图像的水质评价_基于Python和遥感图像的膨胀与腐蚀操作

    引言 膨胀与腐蚀是图像形态学中的基本操作,本文将从两个角度实现python的膨胀与腐蚀算法,分别是特征提取与分割后处理.目前,在RGB图像领域,这两种形态学算法经常用于分割结果的处理,例如连通区处理. ...

  2. python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...

    引言 基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET).其中,RFE整合了两种不同的超参数, ...

  3. 基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法

    普通数码相机记录了红.绿.蓝三种波长的光,多光谱成像技术除了记录这三种波长光之外,还可以记录其他波长(例如:近红外.热红外等)光的信息.与昂贵.不易获取的高光谱.高空间分辨率卫星数据相比,中等分辨率的 ...

  4. 基于 python 多光谱遥感数据处理、图像分类、定量评估及机器学习方法

    普通数码相机记录了红.绿.蓝三种波长的光,多光谱成像技术除了记录这三种波长光之外,还 可以记录其他波长(例如:近红外.热红外等)光的信息.与昂贵.不易获取的高光谱.高空间分辨 率卫星数据相比,中等分辨 ...

  5. python 卡方检验批量筛选_基于Python的遥感特征筛选—卡方检验筛选

    引言 目前,遥感图像在模式识别.图像分割.地面参数反演研究中有着广泛的应用.遥感图像一般具有多个波段,每个波段均反映了地物的不同波谱特性.相对于图像分类而言,不同的波长位置的波谱反射可能存在较多的信息 ...

  6. 基于python的界面自动化测试-基于 Python 的接口自动化测试实例

    1 转换测试数据 1.1将用例数据(红色部分)从excel读取出来,并保存在列表中 测试用例写在excel里面,第一列是编号,第二列到倒数第六列是填写的测试数据, 最后五列分别是用例描述,提交数据,结 ...

  7. python自动化测试-基于 Python 的接口自动化测试实例

    1 转换测试数据 1.1将用例数据(红色部分)从excel读取出来,并保存在列表中 测试用例写在excel里面,第一列是编号,第二列到倒数第六列是填写的测试数据, 最后五列分别是用例描述,提交数据,结 ...

  8. 基于 Python 长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

    植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气.水.土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标.此外 ...

  9. 基于Python/MATLAB长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

    目录 专题一.长时序遥感产品在全球变化/植被变绿/植被物候等方面的应用 专题二.MODIS遥感数据产品预处理 专题三.长时序MODIS遥感数据产品时间序列重构 专题四.基于GIMMS 3g和MODIS ...

最新文章

  1. Android10.0应用进程创建过程以及Zygote的fork流程-[Android取经之路]
  2. 多路I/O转接服务器——epoll
  3. shell 脚本和 bash 脚本的关系
  4. Sqlserver备份存储过程
  5. 任秀计算机音乐,重磅丨15家主流媒体聚焦全球音乐院校校长交流季
  6. windows安装rockmongo的步骤
  7. python分析html文件_如何用Python解析HTML?
  8. linux之文本编辑器
  9. 建模方法(一)-博弈论中使用划线法求解纳什均衡
  10. 微信短信显示服务器解包异常,图解微信常见帐号异常处理办法
  11. python random.sample
  12. godaddy不支持java_godaddy主机被墙的解决方案
  13. 苏大计算机专业就业如何,苏州大学好就业吗?附苏州大学就业率最高的专业名单...
  14. 河南分销系统开发|三级分销跟二级分销的区别是什么?
  15. layui后台添加数据给php,layui怎么实现数据绑定
  16. 浅析2022年6月六级翻译真题
  17. C++ string类和常用接口的实现
  18. am335x硬件定时器使用
  19. zip、rar解压文件
  20. 详解Red Hat Enterprise Linux 各版本区别

热门文章

  1. wonderware配置-许可证安装 1
  2. 5.14上午数据库学习笔记
  3. activity alias又是什么鬼
  4. Pusher入门:客户端事件
  5. 使用CANVAS实现交互性圆形马赛克效果
  6. shell - 循环的2种方式
  7. ZOJ 2112 Dynamic Rankings(主席树-动态第k大)
  8. 国际标准 ISO 15008
  9. 阿里云视频点播加密视频播放报:网络错误加载数据失败(fragLoadError)
  10. linux下面安装geant4,Ubuntu 12.04 下Geant4的安装