如何使用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
相关产品推荐
相关产品推荐

