当前位置: 首页 > article >正文

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

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

1 读取数据

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 去除坏波段

#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 影像查看

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

在这里插入图片描述

4 端元提取

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

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

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 丰度作图

#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 计算丰富度的阈值

#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 端元提取算法中提取的。

# 定义一个函数来计算和显示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.kler.cn/a/504670.html

相关文章:

  • 关于Profinet 从站转 EtherNet/IP 从站网关详细说明
  • 怎样利用海外云手机进行引流?
  • uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?
  • [0405].第05节:搭建Redis主从架构
  • python学opencv|读取图像(三十一)缩放图像的三种方法
  • LSA更新、撤销
  • Flink (五) :DataStream API (二)
  • 将内部部署系统的端口暴露给外部访问,并且仅允许指定 IP 的服务器访问该端口
  • 线上资源访问本地数据-跨域问题总结
  • 在eNSp上telnet一下吧
  • ubuntu下安装Mysql 以及3306端口被占用解决方法
  • Kibana操作ES基础
  • 学习AI大模型的小白入门建议和具体的学习方法推荐
  • 【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology
  • 【学习笔记】Macbook管理多个不同的Python版本
  • 初学者如何用 Python 写第一个爬虫?
  • 1.15学习
  • elementUI项目中,只弹一个【token过期提示】信息框的处理
  • Vue中nextTick实现原理
  • 鸿蒙心路旅程:HarmonyOS NEXT 心路旅程:技术、成长与未来
  • 探索文本相似性算法:解锁文本比对的奥秘
  • 数据结构-ArrayLIst-一起探索顺序表的底层实现
  • 二手车交易系统的设计与实现(代码+数据库+LW)
  • 抖音ip属地没有手机卡会显示吗
  • sql Server服务区cpu占用率高,原因分析
  • 【基于轻量型架构的WEB开发】课程 实验一 mybatis操作 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis