遥感入门实战:用Python和Scikit-learn搞定PaviaU高光谱数据预处理(附完整代码)
遥感入门实战用Python和Scikit-learn搞定PaviaU高光谱数据预处理附完整代码高光谱遥感图像处理正逐渐成为环境监测、农业评估和城市规划等领域的重要工具。对于刚接触这一领域的技术人员来说PaviaU数据集是一个理想的起点。本文将带你从零开始使用Python生态中的常用工具完成高光谱数据的全流程预处理为后续的机器学习任务打下坚实基础。1. 环境准备与数据获取在开始处理PaviaU数据集之前我们需要搭建合适的工作环境。推荐使用Anaconda创建独立的Python环境避免依赖冲突conda create -n hyperspectral python3.8 conda activate hyperspectral pip install numpy scipy matplotlib scikit-learn jupyterPaviaU数据集可以通过学术资源网站免费获取通常以.mat格式存储。这个数据集由ROSIS-3传感器采集包含610×340像素的图像每个像素有103个光谱波段覆盖了意大利帕维亚大学校园的多种地表类型沥青路面草地砾石树木金属板裸土砖块阴影提示下载数据集时注意检查文件完整性.mat文件大小通常在100MB左右过小的文件可能下载不完整。2. 数据加载与初步探索使用Python加载.mat文件需要scipy.io模块。PaviaU数据集在.mat文件中以键值对形式存储我们需要特别关注paviaU这个键import scipy.io import numpy as np # 加载.mat文件 mat_data scipy.io.loadmat(PaviaU.mat) raw_data mat_data[paviaU] # 获取原始数据 print(f数据形状: {raw_data.shape}) # 应输出(610, 340, 103)高光谱数据与普通RGB图像的主要区别在于特性RGB图像高光谱图像波段数量3103值范围0-255无固定范围信息维度空间色彩空间光谱初步可视化可以帮助我们理解数据特性。我们可以选择几个代表性波段进行显示import matplotlib.pyplot as plt fig, axes plt.subplots(1, 3, figsize(15,5)) axes[0].imshow(raw_data[:,:,30], cmapgray) # 显示第30波段 axes[0].set_title(波段30) axes[1].imshow(raw_data[:,:,50], cmapgray) # 显示第50波段 axes[1].set_title(波段50) axes[2].imshow(raw_data[:,:,80], cmapgray) # 显示第80波段 axes[2].set_title(波段80) plt.show()3. 数据标准化处理高光谱数据各波段的数值范围差异较大标准化是必不可少的预处理步骤。Scikit-learn的StandardScaler能有效完成这一任务from sklearn.preprocessing import StandardScaler # 将3D数据重塑为2D (样本×特征) 以便标准化 height, width, bands raw_data.shape data_2d raw_data.reshape(-1, bands) # 初始化并拟合标准化器 scaler StandardScaler() scaler.fit(data_2d) # 应用标准化 data_standardized scaler.transform(data_2d) # 恢复原始形状 data_processed data_standardized.reshape(height, width, bands)标准化过程中常见的几个问题及解决方案内存不足对于大型数据集可以分批处理NaN值检查数据中是否存在无效值必要时进行填充零方差特征某些波段可能方差为零需要特殊处理注意标准化参数(scaler)需要保存以便对新数据应用相同的变换。4. 样本切片生成与数据集构建为准备机器学习任务我们需要将图像转换为适合模型输入的样本切片。以下是创建样本切片的完整流程import os from sklearn.utils import shuffle # 参数设置 PATCH_SIZE 17 # 切片大小 TEST_FRAC 0.2 # 测试集比例 OUTPUT_CLASSES 9 # 类别数量 MARGIN 8 # 边缘填充 def pad_data(X, margin): 边缘填充函数 new_X np.zeros((X.shape[0], X.shape[1]2*margin, X.shape[2]2*margin)) new_X[:, margin:-margin, margin:-margin] X return new_X def create_patch(X, patch_size, h, w): 创建单个切片 patch X[:, h:hpatch_size, w:wpatch_size] # 波段级中心化 for i in range(X.shape[0]): patch[i] patch[i] - np.mean(patch[i]) return patch # 边缘填充 data_padded pad_data(data_processed, MARGIN) # 初始化存储结构 train_patches, test_patches [], [] train_labels, test_labels [], [] # 遍历所有类别 for class_id in range(OUTPUT_CLASSES): class_patches [] class_labels [] # 遍历图像空间维度 for h in range(data_processed.shape[1]): for w in range(data_processed.shape[2]): if label[h,w] class_id1: # 标签从1开始 patch create_patch(data_padded, PATCH_SIZE, h, w) class_patches.append(patch) class_labels.append(class_id) # 打乱并划分数据集 class_patches, class_labels shuffle(class_patches, class_labels) split_idx int(len(class_patches) * TEST_FRAC) test_patches.extend(class_patches[:split_idx]) train_patches.extend(class_patches[split_idx:]) test_labels.extend(class_labels[:split_idx]) train_labels.extend(class_labels[split_idx:]) # 转换为numpy数组 train_patches np.array(train_patches) test_patches np.array(test_patches) train_labels np.array(train_labels) test_labels np.array(test_labels)5. 数据保存与后续使用处理完成的数据可以保存为多种格式便于后续使用。以下是保存为.npy格式的示例# 创建保存目录 os.makedirs(processed_data, exist_okTrue) # 保存训练集 np.save(processed_data/train_patches.npy, train_patches) np.save(processed_data/train_labels.npy, train_labels) # 保存测试集 np.save(processed_data/test_patches.npy, test_patches) np.save(processed_data/test_labels.npy, test_labels)对于深度学习框架数据通常需要转换为张量格式import torch # 转换为PyTorch张量 train_tensor torch.from_numpy(train_patches).float() train_labels_tensor torch.from_numpy(train_labels).long() # TensorFlow示例 import tensorflow as tf train_dataset tf.data.Dataset.from_tensor_slices((train_patches, train_labels))在实际项目中我发现将切片尺寸设置为奇数如17×17效果通常更好因为这样每个切片都有明确的中心像素。边缘填充的大小应至少为(PATCH_SIZE-1)/2这样才能确保原始图像边缘的像素也能成为切片的中心。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2520024.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!