欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 高光谱遥感图像处理之数据分类的fcm算法

高光谱遥感图像处理之数据分类的fcm算法

2025/5/17 22:02:27 来源:https://blog.csdn.net/feifeigo123/article/details/148008779  浏览:    关键词:高光谱遥感图像处理之数据分类的fcm算法

基于模糊C均值聚类(FCM)的高光谱遥感图像分类MATLAB实现示例

%% FCM高光谱图像分类示例
clc; clear; close all;%% 数据加载与预处理
% 加载示例数据(此处使用公开数据集Indian Pines的简化版)
load('indian_pines.mat'); % 包含变量data(610x145x200)和ground_truth(610x145)
data = double(reshape(data, [], 200)); % 转换为610x145x200 → 92450x200矩阵
data = data ./ max(max(max(data)));   % 简单归一化% 生成训练样本(实际应用中应使用更合理采样方法)
[trainInd, ~] = crossvalind('HoldOut', size(data,1), 0.3);
trainData = data(trainInd,:);
testData = data(~trainInd,:);%% FCM参数设置
options = [2, 100, 1e-5, 0]; % 参数向量:[模糊指数m, 最大迭代次数, 误差阈值, 显示信息]
numClusters = 16;            % 聚类数目
exponent = options(1);       % 模糊权重指数m%% 执行FCM聚类
[centers, U] = fcm(trainData', numClusters, [2 options(2) options(3) options(4)]);%% 分类预测
% 计算测试样本隶属度
testU = zeros(size(testData,1), numClusters);
for i = 1:size(testData,1)distances = sum((centers' - testData(i,:)).^2, 2);testU(i,:) = 1 ./ (distances.^(2/(exponent-1)) * sum(1./distances.^(2/(exponent-1))));
end% 获取最终分类结果
[~, predictedLabels] = max(testU, [], 2);%% 结果评估(假设有ground truth)
% 转换测试集真实标签
trueLabels = ground_truth(~trainInd);
% 计算混淆矩阵
C = confusionmat(trueLabels, predictedLabels);
% 计算总体准确率
OA = sum(diag(C))/sum(C(:));
disp(['Overall Accuracy: ', num2str(OA*100), '%']);%% 可视化(降维展示)
% 使用t-SNE进行降维
Y = tsne(testData(:,1:10)); % 取前10个波段进行可视化
figure;
gscatter(Y(:,1), Y(:,2), predictedLabels);
title('FCM Classification Result (t-SNE Projection)');
xlabel('t-SNE 1'); ylabel('t-SNE 2');%% FCM函数实现
function [centers, U] = fcm(data, numClusters, options)% 输入:% data      - 输入数据矩阵(N x D)% numClusters - 聚类数目% options   - [m, maxIter, error, display]% 输出:% centers   - 聚类中心(N x 1)% U         - 隶属度矩阵(numClusters x N)[N, D] = size(data);m = options(1);        % 模糊指数maxIter = options(2);  % 最大迭代次数error = options(3);    % 停止阈值display = options(4);  % 显示信息标志% 初始化隶属度矩阵U = rand(numClusters, N);U = U ./ sum(U, 1);for iter = 1:maxIter% 更新聚类中心centers = (U.^m)' * data ./ sum(U.^m)';% 计算距离矩阵distances = pdist2(data, centers);% 更新隶属度矩阵U_new = 1 ./ (distances.^(-2/(m-1)) * ones(1,N));% 检查收敛if max(abs(U_new(:) - U(:))) < errorbreak;endU = U_new;if display && mod(iter,10)==0fprintf('Iteration %d, Max Error: %f\n', iter, max(abs(U_new(:)-U(:))));endend
end

代码说明:

  1. 数据准备
    • 使用Indian Pines数据集作为示例(需自行下载完整数据)
    • 数据归一化处理以提高聚类效果
    • 采用30%的数据作为训练样本
  2. FCM实现
    • 包含自定义的FCM函数实现
    • 支持模糊指数调整(默认m=2)
    • 包含收敛判断和迭代信息显示
  3. 分类预测
    • 对测试样本计算各聚类中心的隶属度
    • 通过最大隶属度原则确定最终分类
  4. 结果评估
    • 计算总体准确率(OA)
    • 显示混淆矩阵
  5. 可视化
    • 使用t-SNE进行高维数据降维可视化
    • 不同颜色表示不同分类结果

高光谱遥感图像处理之数据分类的fcm算法源代码maltlab

使用建议:

  1. 需要安装Statistics and Machine Learning Toolbox
  2. 实际应用时应:
    • 使用更合理的训练样本选择方法(如分层抽样)
    • 调整FCM参数(模糊指数m通常取1.5-2.5)
    • 考虑结合领域知识选择聚类数目
    • 对于大数据可采用分块处理或降维技术
  3. 性能优化方向:
    • 使用矩阵运算代替循环
    • 利用GPU加速计算
    • 采用更高效的数据结构

注意事项:

  • 高光谱数据维度较高时建议先进行特征选择/降维
  • FCM对初始值敏感,可多次运行取最优结果
  • 实际应用中应结合光谱匹配等专业方法进行验证

如果需要处理实际高光谱数据文件(如ENVI格式),可以添加相应的数据读取代码,并调整数据预处理步骤。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词