如何基于PCA彩色合成图对高光谱图像原始光谱进行聚类分组?
基于PCA彩色合成图的高光谱原始光谱聚类方案(ENVI+Python)
ENVI工具操作流程
步骤1:基于PCA彩色合成图创建ROI
- 打开生成的PCA彩色合成图像,启动
ROI Tool(菜单栏>Tools>ROI Tool) - 针对图像中观察到的每个聚类模式,分别创建独立的ROI类别(可使用手绘、多边形或阈值工具圈选),确保每个聚类区域被准确覆盖
步骤2:提取ROI对应的完整原始光谱
- 打开原始高光谱图像,在Toolbox中找到
Region of Interest > Extract ROIs from Image工具 - 选择原始高光谱文件和已保存的ROI文件,设置输出路径后运行,即可得到每个ROI对应的原始全波段光谱数据集
步骤3:基于原始光谱的自动聚类(可选)
- 若需要对原始光谱做自动聚类,可使用
Classification > Unsupervised Classification > K-Means工具 - 输入原始高光谱图像,设置聚类数量(参考PCA图中观察到的聚类数目),运行后生成分类结果;后续可结合已创建的ROI对分类结果进行验证或调整
Python解决方案
依赖库:spectral、numpy、scikit-learn、scikit-image
1. 读取数据
import spectral.io.envi as envi import numpy as np from sklearn.cluster import KMeans from skimage.segmentation import slic # 读取原始高光谱数据和PCA彩色合成图 hyperspec_data = envi.open('your_raw_hyperspec.hdr', 'your_raw_hyperspec.dat').load() pca_rgb = envi.open('your_pca_rgb.hdr', 'your_pca_rgb.dat').load()
2. 基于PCA图获取初始聚类区域
用SLIC分割PCA图得到初始的聚类掩码(也可手动标注ROI):
# 根据PCA图中的聚类数设置n_segments seg_mask = slic(pca_rgb, n_segments=5, compactness=10, sigma=1)
3. 提取分组原始光谱
spectral_groups = [] # 遍历每个分割区域,提取对应原始光谱 for seg_id in np.unique(seg_mask): region_mask = seg_mask == seg_id # 提取该区域的所有全波段光谱 region_spectra = hyperspec_data[region_mask].reshape(-1, hyperspec_data.shape[2]) spectral_groups.append(region_spectra)
4. 基于原始光谱的优化聚类(可选)
如果初始分割不够精准,可对提取的原始光谱做K-Means聚类再映射回图像:
# 合并所有区域的光谱 all_spectra = np.vstack(spectral_groups) # 初始化K-Means,聚类数参考PCA图中的聚类数 kmeans = KMeans(n_clusters=5, random_state=42) cluster_labels = kmeans.fit_predict(all_spectra) # 将聚类标签映射回图像 final_label_img = np.zeros_like(seg_mask) current_idx = 0 for seg_id in np.unique(seg_mask): region_mask = seg_mask == seg_id region_size = region_mask.sum() final_label_img[region_mask] = cluster_labels[current_idx:current_idx+region_size] current_idx += region_size
内容的提问来源于stack exchange,提问作者domarom
相关产品推荐
相关产品推荐

