You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用spectral.imshow()在子图网格中绘制多幅高光谱图像

多幅高光谱图像网格布局绘制方案

spectral库的sp.imshow方法默认会创建独立画布弹窗,直接循环调用无法生成统一网格子图,可通过绑定预创建的matplotlib轴对象实现需求,具体实现如下:

核心逻辑

  • 提前关闭spectral默认交互弹窗模式,避免循环时弹出多个独立窗口
  • 根据样本总数创建适配的matplotlib子图网格,13个样本选择4行4列布局最紧凑,多余子图后续隐藏即可
  • 循环读取HSI文件时,直接将对应位置的子图轴对象传入sp.imshow,完成绑定绘制
  • 提前对文件路径列表排序,避免头文件和数据文件匹配错位

修正后可运行代码

from pathlib import Path
import spectral as sp
import matplotlib.pyplot as plt

# 关闭spectral默认交互弹窗
sp.settings.interactive = False

files_path = Path(r"C:\data\Reflectance_Calibrated")
# 对文件列表排序,保证hdr与img文件一一对应
hdr_list = sorted(files_path.glob('*.hdr'))
bin_list = sorted(files_path.glob('*.img'))
targets = list(zip(hdr_list, bin_list))

# 创建4*4子图网格,展平为一维数组方便按索引遍历
fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(16, 16))
axes_flat = axes.flatten()

for idx, (hdr_path, img_path) in enumerate(targets):
    hsi_data = sp.envi.open(hdr_path, img_path)
    # 绑定当前子图轴绘制高光谱RGB可视化结果
    sp.imshow(hsi_data, axes=axes_flat[idx], title=f"样本 {idx+1}")

# 隐藏最后一个多余的空白子图
axes_flat[-1].axis('off')

# 自动调整子图间距避免重叠
plt.tight_layout()
plt.show()

可选配置

  • 若需要自定义RGB合成的波段,可给sp.imshow传入bands=(红波段索引, 绿波段索引, 蓝波段索引)参数指定
  • 若需要调整子图大小,修改plt.subplots的figsize参数即可
  • 若需要其他网格排布,自行调整nrows、ncols数值保证子图总数≥13即可,多余子图统一设置axis('off')隐藏

内容的提问来源于stack exchange,提问作者JuanCMontesH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:45:43