基于pysptools实现端元提取及无监督光谱分类

news/2025/1/17 14:34:54/

本文通过一个光谱分解示例来对 SERC 高光谱数据文件进行无监督分类,使用PySpTools包进行端元提取,绘制光谱端元丰度图,并使用光谱角度映射(Spectral Angle Mapping)和光谱信息散度(Spectral Information Divergence)对光谱端元进行分类

1 读取数据

python">load_start_time = time.time()
h5refl_filename = 'reflectance.h5'
data,header = read_neon_reflh5(h5refl_filename)
print('Data took ', round(time.time() - load_start_time,1), ' seconds to load.')
print('Raw Data Dimensions:\n',data.shape) #(1000, 1000, 426)# 数据截取,方便计算
data = data[-100:,-100:,:]

2 去除坏波段

python">#remove bad bands
clean_start_time = time.time()
data_clean,header_clean = clean_neon_refl_data(data,header)
print('\nData took', round(time.time() - clean_start_time,1), 'seconds to clean.')
print('Cleaned Data Dimensions:',data_clean.shape)

在这里插入图片描述

3 影像查看

python">plot_aop_refl(data_clean[:,:,[54,34,14]],header_clean['spatial extent'],(0,1))

在这里插入图片描述

4 端元提取

光谱分解(Spectral Unmixing)允许像素由每一类的分数(fractions)或丰度(abundances)组成。

端元(Endmembers)可以被认为是图像的基础光谱。一旦确定了这些端元光谱,图像立方体就可以“分解”(unmixed)为每个像素中每种物质的丰度分数。

python">wavelength_float = [float(i) for i in header_clean['wavelength']]
ee_axes = {}
ee_axes['wavelength'] = wavelength_float
ee_axes['x']='Wavelength, nm'
ee_axes['y']='Reflectance#Endmember Extraction (Unmixing) - NFINDR Algorithm (Winter, 1999)
ee_start_time = time.time()
ee = eea.NFINDR()
U = ee.extract(data_clean,4,maxit=5,normalize=False,ATGP_init=True)
ee.display(axes=ee_axes,suffix='SERC')
print('Endmember extraction took ', round(time.time() - ee_start_time,1), ' seconds to run.')

在这里插入图片描述

5 丰度作图

python">#Abundance Maps
amap_start_time = time.time()
am = amap.FCLS()
amaps = am.map(data_clean,U,normalize=False)
am.display(colorMap='jet',columns=4,suffix='SERC')
print('Abundance maps took ', round(time.time() - amap_start_time,1), ' seconds to generate.')

在这里插入图片描述

6 计算丰富度的阈值

python">#Look at histogram of each abundance map to determine ballpark for thresholds to use
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(18,8))ax1 = fig.add_subplot(2,4,1); plt.title('EM1')
amap1_hist = plt.hist(np.ndarray.flatten(amaps[:,:,0]),bins=50,range=[0,1.0]) ax2 = fig.add_subplot(2,4,2); plt.title('EM2')
amap1_hist = plt.hist(np.ndarray.flatten(amaps[:,:,1]),bins=50,range=[0,0.001]) ax3 = fig.add_subplot(2,4,3); plt.title('EM3')
amap1_hist = plt.hist(np.ndarray.flatten(amaps[:,:,2]),bins=50,range=[0,0.5]) ax4 = fig.add_subplot(2,4,4); plt.title('EM4')
amap1_hist = plt.hist(np.ndarray.flatten(amaps[:,:,3]),bins=50,range=[0,0.05])

在这里插入图片描述

7 SAM或SID分类

光谱角度映射(Spectral Angle Mapper, SAM):

  • 是一种基于物理的光谱分类,它使用 n-D 角度将像素与参考光谱进行匹配。该算法通过计算光谱之间的角度并将它们视为维数等于波段数的空间中的向量来确定两个光谱之间的光谱相似度。
  • 当用于校准的反射率数据时,对照明和反照率相对不敏感。 SAM 使用的端元光谱是从 NFINDR 算法中提取的。 SAM 比较端元谱向量与 n-D 空间中每个像素向量之间的角度
  • 较小的角度表示与参考光谱更接近的匹配远离指定最大角度阈值(以弧度表示)的像素不会被分类

光谱信息散度(Spectral Information Divergence, SID):

  • 是一种光谱分类方法,它使用散度度量将像素与参考光谱进行匹配
  • 散度越小,像素相似的可能性就越大。测量值大于指定最大散度阈值的像素不会被分类

本例中 SID 使用的端元光谱是从 NFINDR 端元提取算法中提取的。

python"># 定义一个函数来计算和显示SID
#Spectral Information Divergence
def SID(data,E,thrs=None):sid = cls.SID() cmap = sid.classify(data,E,threshold=thrs)sid.display(colorMap='tab20b',suffix='SERC')# 使用包含最多信息的三个最终成员(类)来调用此函数:
U2 = U[[0,2,3],:]
SID(data_clean, U2, [0.8,0.3,0.03])

在这里插入图片描述

从图中我们可以看到,SID 在识别房屋、土地和植被方面做得相当好。

对于光谱角映射分类将SID()换成SAM()即可。


http://www.ppmy.cn/news/1563904.html

相关文章

Bootstrap UI 编辑器

关于《Bootstrap UI 编辑器》的文章,我为您整理了以下信息: Bootstrap UI 编辑器是一种基于 Bootstrap 框架的图形化界面设计工具,它允许用户通过拖放组件和设置属性来创建网页布局,而无需编写复杂的 HTML、CSS 和 JavaScript 代…

深度学习-87-大模型训练之预训练和微调所用的数据样式

文章目录 1 大模型训练的阶段1.1 预训练1.1.1 全量预训练1.1.2 二次预训练1.2 微调2 预训练需要的数据2.1 清洗成的文本文档2.2 如何从文本文档学习2.3 常见预训练中文语料库3 微调需要的数据3.1 微调例子一:电商客服场景3.2 微调例子二:行政咨询场景3.3 微调数据长什么样3.3…

未来量子计算技术会如何影响音频DSP的发展?

量子计算技术的进步预计对音频数字信号处理(DSP)的发展产生深远的影响。虽然量子计算目前还处于早期阶段,但可以预见其潜在应用和影响如下: 1. 计算能力的提升 更快的处理速度:量子计算能够通过量子并行处理大幅提升计…

【微服务justsoso-cloud系列】目录

【微服务justsoso-cloud系列】目录 1.vagrantvirtualbox实现centos7安装 2.centos7安装jdk17教程 3.Linux安装Docker教程(详解) 4.Linux安装git 5.zerotier搭建虚拟局域网,自建planet

《小迪安全》学习笔记05

目录 读取: 写入: (其中的读取和写入时我认为比较重要的,所以单独做成了目录,这里的读取和写入是指在进行sql注入的时候与本地文件进行的交互) 好久没发博客了。。。从这篇开始的小迪安全学习笔记就开始…

华为2024嵌入式研发面试题

01 你认为最好的排序算法是什么? 在实际的编程中,最好的排序算法要根据实际需求和数据规模来选择,因为每种排序算法都有其优势和劣势。以下是一些常见排序算法及其优缺点: 冒泡排序 冒泡排序是一种简单直观的排序算法&#xff0…

案例|富唯智能复合机器人CNC柔性上下料

随着制造业的快速发展,提高生产效率、降低人力成本、确保产品质量已成为企业竞争的关键。本项目针对一家模具制造企业的CNC加工环节,引入富唯智能复合机器人自动上下料系统,以优化生产流程,提升生产效率。 项目难点 1.多环节协同…

javaEE初阶————多线程初阶(1)

多线程初阶———— 1,认识线程 1.1 概念 1)线程是什么 线程就是一个“执行流”,可以理解为程序执行的最小单位; 可以看成轻量级的进程; 2)为啥要有线程 “并发编程” 的需要,但是我们不…