【遥感图像处理】绘制高光谱3D立方体

1. 前言

​ 在之前的一篇文章中,介绍了高光谱图像的特点和表达形式。高光谱图像最突出的一个特点拥有大量光谱波段,使得图像堆叠成一个超立方体。由于最近研究需要,需要可视化展示HSI图像的3D立方体。于是,搜索了一些资料,展开了工作。以下是绘制的两种方式。

2. 方式一:使用python

​ 这种方法很简单,几行代码就可以搞定,废话不多说,直接上代码。

​ 需要的环境:spectral,ipython,matplotlib

import  os
import scipy.io as sio
from spectral import *

dataset_path = os.path.join('data') # 数据集路径
data = sio.loadmat(os.path.join(dataset_path, 'indian_pines_corrected.mat'))['indian_pines_corrected']
spectral.settings.WX_GL_DEPTH_SIZE = 100
view_cube(data, bands=[29, 19, 9])
  1. 以“pylab”模式启动IPython。命令行输入:ipython --pylab
  2. 将以下代码(注意修改数据集路径)复制到ipython命令窗口中,回车。
  3. 这个时候,会弹出Hypercube的窗体,就可以看到绘制的3D图像了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ky7n4MQ-1585629618430)(D:%5CUseTools%5CTypora%5Cimages%5Cimage-20200331120413960.png)]

​ 值得一提的是,可以通过鼠标和键盘对绘制的图像进行旋转,放大,缩小等操作。

Mouse Functions:

left-click & drag -> Rotate cube (选择)
CTRL+left-click & drag -> Zoom in/out(放大/缩小)
SHIFT+left-click & drag -> Pan(平移)

Keybinds:

l -> toggle light(调整亮度)
t/g -> stretch/compress z-dimension(拉伸)
h -> print help message(帮助信息)
q -> close window(关闭窗口)

3.方式二:使用ENVI

​ 作为一个强大的遥感处理平台,Envi做这点小事简直不在话下。但是这里却到了一个问题,由于使用的高光谱数据集是mat格式,Envi是不支持这种格式的。无奈只能先将mat格式转成了tif格式。

  1. 使用MatLab将mat格式转为tif,废话不多说,直接上代码。(参考https://blog.csdn.net/Eric_Fisher/article/details/90230072)

    % mat2tif
    % 将高光谱mat文件,保存为tif
    clc; clear; close all;
    %% load the hyperspectral image
    img = load ('E:\HSI_Data\Indian Pines\Indian_pines_corrected.mat'); 
    img = img.indian_pines_corrected
    % 获取数组维度信息
    [row, col, bands] = size(img);
    % double类型转unit8
    img_8 = uint8(img(:,:,:)/10000*256);
    
    % 保存为tif图像
    t = Tiff('imageIndiaP.tif','w');
    % 影像信息
    tagstruct.ImageLength = size(img_8,1); 
    tagstruct.ImageWidth = size(img_8,2);  
    
    % 颜色空间解释方式
    tagstruct.Photometric = 1;
    
    % 每个像素的数值位数,这里转换为unit8,所以为8位
    tagstruct.BitsPerSample = 8;
    % 每个像素的波段个数,一般图像为1或3,但是对于遥感影像存在多个波段所以常常大于3
    tagstruct.SamplesPerPixel = bands;
    tagstruct.RowsPerStrip = 16;
    tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky;
    % 表示生成影像的软件
    tagstruct.Software = 'MATLAB'; 
    % 表示对数据类型的解释
    tagstruct.SampleFormat = 1;
    % 设置Tiff对象的tag
    t.setTag(tagstruct);
    
    % 以准备好头文件,开始写数据
    t.write(img_8);
    % 关闭影像
    t.close;
    
  2. 使用Envi打开第一步中所生成的tif图。在Envi工具栏中选择Spectral->Build 3D Cube。在3D Cube File对话框中选择高光谱数据集,单击OK按钮。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7N7oVUt-1585629618431)(D:%5CUseTools%5CTypora%5Cimages%5Cimage-20200331121800317.png)]

  3. 当单开3D Cube RGB Face Input Bands对话框时,通过点击所需的波段,选择置于图像表面的RGB波段,这里使用的Indian pines数据集,RGB分别使用了29,19,9波段(后经实验发现,使用29,42 ,89显示效果更佳),单击OK按钮。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AhoOK6YF-1585629618434)(D:%5CUseTools%5CTypora%5Cimages%5Cimage-20200331122313148.png)]

  4. 在打开3D Cube Parameters对话框中,设置以下参数:

    (1)Color Table使用了默认参数。

    (2)波普缩放系数(Spectral Scale):波普放大系数,对于多光谱等波段数较少的数据,可以适当的设置这个系数。

    (3)选择输出路径及文件名,单O击OK按钮执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6eHnYl1-1585629618436)(D:%5CUseTools%5CTypora%5Cimages%5Cimage-20200331122737659.png)]

​ (4)显示结果图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vh9IzKkN-1585629618438)(D:%5CUseTools%5CTypora%5Cimages%5Cimage-20200331123121614.png)]

4. 可能遇到的问题

(1)报错一:缺少wxpython库

ImportError: Required dependency wx.glcanvas not present

解决方法:

conda install wxpython

(2)报错二:缺少OpenGL库

ModuleNotFoundError: No module named 'OpenGL'

解决方法:

conda install PyOpenGL

(3)报错三:

UserWarning: There is no current wx.App object - creating one now.

解决方法:

不要在idle中运行,可以在cmd下运行。

参考链接

(1)https://blog.csdn.net/gwj992/article/details/79274511?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

(2)https://blog.csdn.net/qq_28368377/article/details/110148181

参考书籍

ENVI 遥感图像处理方法(第二版)[邓书斌 陈秋锦 杜会建 徐恩惠]

  • 32
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值