如何用Python从高光谱超立方体数据绘制近红外反射率-波长图?
绘制高光谱反射率-波长关系图的Python实现
核心步骤
- 读取ENVI格式高光谱数据与ROI掩码
- 提取目标区域的反射率统计值
- 从头文件中获取波长信息
- 绘制反射率随波长变化的曲线
依赖库安装
先安装所需工具包:
pip install spectral pillow matplotlib numpy
示例代码
import numpy as np import spectral as spy from PIL import Image import matplotlib.pyplot as plt # 读取高光谱立方体与ROI掩码 hypercube = spy.open_image('cube_envi32.hdr') reflectance_data = hypercube.load() # 数据形状:(行数, 列数, 波段数) roi_mask = np.array(Image.open('roi_masks.bmp')) # 校验掩码与高光谱数据的空间维度一致性 assert roi_mask.shape == reflectance_data.shape[:2], "掩码与高光谱数据空间维度不匹配" # 提取ROI区域的反射率(假设掩码中白色255为目标区域) roi_pixels = reflectance_data[roi_mask == 255] # 计算ROI区域的平均反射率(按波段取均值) mean_reflectance = np.mean(roi_pixels, axis=0) # 从ENVI头文件中读取波长信息 wavelengths = hypercube.bands.centers # 绘制关系图 plt.figure(figsize=(10, 6)) plt.plot(wavelengths, mean_reflectance, color='#1f77b4', linewidth=2) plt.xlabel('波长 (nm)') plt.ylabel('反射率') plt.title('ROI区域平均反射率-波长曲线') plt.grid(True, linestyle='--', alpha=0.7) plt.show()
关键注意事项
- 掩码值适配:如果你的ROI掩码用其他灰度值标记目标区域(比如黑色0),需修改
roi_mask == 255中的数值。 - 数据类型转换:若反射率数据为整数类型,建议转为浮点型(
reflectance_data = reflectance_data.astype(np.float32))避免计算偏差。 - 统计量替换:除了平均反射率,可替换为中位数、最大值/最小值,只需将
np.mean改为np.median、np.max、np.min。 - 多ROI处理:若掩码包含多个不同灰度值的区域,可循环提取各区域反射率并在同图绘制多条曲线。
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

