Python高光谱遥感影像处理问题详细分析讲解
作者:倾城一少 发布时间:2023-10-04 04:03:37
标签:Python,高光谱,遥感影像
前言
在写波段配准相关代码时经常需要用到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.")
相比于单张影像裁剪,批量裁剪就是多加了个循环,实现了批量操作,也比较简单。
来源:https://blog.csdn.net/u010329292/article/details/128712909
0
投稿
猜你喜欢
- 虽然说标题将的是首页的访问感受,但是同样适合于网站其它页面的用户体验设计,一个好的网站设计应当尽量做到首页和次页一视同仁。第一步(视觉设计)
- 利用XMLHTTP无刷新自动实时更新数据,2秒自动刷新一次,2秒取得一次数据.demo.htm 前台显示<script la
- 本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下KNN分类算法应该算得上是机器学习中最简单的分类算法了,
- 介绍PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、
- 本文实例讲述了Python素数检测的方法。分享给大家供大家参考。具体如下:该程序实现了素数检测器功能,如果结果是true,则是素数,如果结果
- 相关验证码文章:asp制作验证码的方法 轩魂ASP中文验证码下载 先产生一个4位数的随机码源代码:ychar="0,1,2,3,4
- 嗯,开场先胡扯几句不相关地感言。最近的工作让我有了很多实践的机会,同时也让我收获颇丰。在群里聊天的时候也提到过,所有的学习过程,最好是理论-
- 01_msgbox# 使用easygui功能,可以直接导入easygui模块import easygui# 需要弹框时,要使用easygui
- 本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下案例:有时我们希望自定义的类,实例间可以使用比较运算符进行
- 我们在前面的几节中分别讲了提高网站性能中内容、服务器、JavaScript和CSS等方面的内容。除此之外,图片和Coockie也是我们网站中
- 导言:在前面的教程我们阐述了应用程序处理二进制数据的2种模式,以及使用FileUpload 控件从浏览器向服务器文件系统上传文件。当文件上传
- 结合这个例子分析一下结果:结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现。先查看下Go中的这两个运算符是啥吧。①对于所有带
- 今天修改之前实习小伙伴写的js代码的时候,遇到修改后页面未发生变化的问题。因为我是web开发小白,所以上网查了一波,得以解决~~初次进行we
- 可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助:1、它是函数的方法或属性;2、
- 有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,
- 在本身比较复杂的页面里,再突出信息,往往是把几种方法叠加起来使用,比如加粗加大、加粗加色等,区别在于使用的类别和程度。导致的结果是呈现越来越
- 运行截图运行效果:什么?你说你看不清烟花?那我换一种颜色,请点开看。实现过程准备工作使用语言和框架:python、pygame。安装pyga
- 本文实例讲述了Python Web框架之Django框架cookie和session用法。分享给大家供大家参考,具体如下:part 1 概念
- 题目描述1266. 访问所有点的最小时间 - 力扣(LeetCode)平面上有 n 个点,点的位置用整数坐标表示 poi
- 再之前同时安装 python 后 只需把环境变量PATH 里面改为PATH=C:\Python36-32\Scripts\;C:\Pytho