基于主成分分析(PCA)与K均值聚类的SAR影像变化检测

基于主成分分析(PCA)与K均值聚类的SAR影像变化检测

一、SAR影像变化检测原理与流程

1.1 整体技术路线

输入:两时相SAR影像 (T1, T2)
      ↓
预处理:辐射校正、几何配准、滤波去噪
      ↓
特征提取:对数比值、差值、主成分分析
      ↓
PCA变换:提取差异信息主成分
      ↓
K均值聚类:将像素分为变化/未变化类
      ↓
后处理:形态学滤波、去除小区域
      ↓
输出:变化检测二值图

1.2 核心算法原理

方法 原理 在变化检测中的作用
PCA 将高维数据投影到低维正交空间,保留最大方差方向 提取两时相影像的主要差异信息,抑制噪声
K均值聚类 基于距离度量将数据划分为K个簇,最小化簇内方差 将PCA特征空间中的像素自动分类为变化/未变化

二、完整MATLAB实现代码

%% SAR影像变化检测:PCA + K均值聚类
clear; clc; close all;

%% 1. 数据准备与预处理
% 假设已有两时相SAR影像:T1, T2 (已配准、辐射校正)
% 这里使用模拟数据演示,实际应用时替换为真实SAR数据

% 生成模拟SAR影像(512×512)
[M, N] = [512, 512];
T1 = im2double(imread('sar_time1.tif'));  % 替换为实际影像
T2 = im2double(imread('sar_time2.tif'));  % 替换为实际影像

% 如果影像过大,可进行降采样
if size(T1,1) > 1024
    T1 = imresize(T1, 0.5);
    T2 = imresize(T2, 0.5);
    [M, N] = size(T1);
end

% 显示原始影像
figure('Position', [100, 100, 1200, 400]);
subplot(1,3,1); imshow(T1, []); title('时相1 SAR影像');
subplot(1,3,2); imshow(T2, []); title('时相2 SAR影像');
subplot(1,3,3); imshow(abs(T2-T1), []); title('差异图(绝对值)');

%% 2. 预处理:滤波去噪(Lee滤波)
% SAR影像通常需要滤波以减少相干斑噪声
fprintf('正在进行Lee滤波...\n');
window_size = 5;
T1_filtered = lee_filter(T1, window_size);
T2_filtered = lee_filter(T2, window_size);

figure('Position', [100, 100, 1200, 400]);
subplot(1,3,1); imshow(T1_filtered, []); title('时相1(滤波后)');
subplot(1,3,2); imshow(T2_filtered, []); title('时相2(滤波后)');
subplot(1,3,3); imshow(abs(T2_filtered-T1_filtered), []); title('滤波后差异图');

%% 3. 特征提取:构建多特征差异图
fprintf('构建多特征差异图...\n');

% 3.1 对数比值特征(对SAR影像变化敏感)
log_ratio = abs(log(T2_filtered + eps) - log(T1_filtered + eps));

% 3.2 差值特征
difference = abs(T2_filtered - T1_filtered);

% 3.3 均值比值特征
window = fspecial('average', 7);
T1_mean = imfilter(T1_filtered, window, 'replicate');
T2_mean = imfilter(T2_filtered, window, 'replicate');
mean_ratio = abs(T2_mean ./ (T1_mean + eps));

% 3.4 局部方差特征
T1_var = stdfilt(T1_filtered).^2;
T2_var = stdfilt(T2_filtered).^2;
var_ratio = abs(log(T2_var + eps) - log(T1_var + eps));

% 显示各特征图
figure('Position', [100, 100, 1200, 800]);
subplot(2,2,1); imshow(log_ratio, []); title('对数比值特征');
subplot(2,2,2); imshow(difference, []); title('差值特征');
subplot(2,2,3); imshow(mean_ratio, []); title('均值比值特征');
subplot(2,2,4); imshow(var_ratio, []); title('方差比值特征');

%% 4. PCA变换:提取主要差异信息
fprintf('进行PCA变换...\n');

% 将多特征组合成特征矩阵
% 每个像素有4个特征:log_ratio, difference, mean_ratio, var_ratio
features = zeros(M*N, 4);
features(:,1) = log_ratio(:);
features(:,2) = difference(:);
features(:,3) = mean_ratio(:);
features(:,4) = var_ratio(:);

% 标准化特征(零均值、单位方差)
features_zscore = zscore(features);

% PCA计算
[coeff, score, latent, ~, explained] = pca(features_zscore);

% 显示PCA解释的方差比例
figure;
pareto(explained);
xlabel('主成分');
ylabel('解释方差比例 (%)');
title('PCA主成分方差解释比例');

% 选择前k个主成分(通常累计解释方差>95%)
cumulative = cumsum(explained);
k = find(cumulative >= 95, 1);
fprintf('选择前%d个主成分,累计解释方差: %.2f%%\n', k, cumulative(k));

% 重构主成分图像
PC_images = zeros(M, N, k);
for i = 1:k
    PC_images(:,:,i) = reshape(score(:,i), M, N);
end

% 显示主成分图像
figure('Position', [100, 100, 1200, 400]);
for i = 1:min(k, 4)
    subplot(1,4,i);
    imshow(PC_images(:,:,i), []);
    title(sprintf('PC%d (%.1f%%)', i, explained(i)));
end

%% 5. K均值聚类:变化/未变化分类
fprintf('进行K均值聚类...\n');

% 使用前k个主成分作为聚类特征
cluster_features = score(:,1:k);

% 确定最佳聚类数(肘部法则)
max_clusters = 5;
inertia = zeros(max_clusters, 1);

for n_clusters = 1:max_clusters
    [~, ~, sumd] = kmeans(cluster_features, n_clusters, ...
        'MaxIter', 1000, 'Replicates', 10, 'Display', 'off');
    inertia(n_clusters) = sum(sumd);
end

% 绘制肘部曲线
figure;
plot(1:max_clusters, inertia, 'bo-');
xlabel('聚类数');
ylabel('簇内距离和');
title('肘部法则确定最佳聚类数');
grid on;

% 选择聚类数(通常为2:变化/未变化)
K = 2;
fprintf('使用K=%d进行聚类(变化/未变化)\n', K);

% K均值聚类
[idx, centers, sumd] = kmeans(cluster_features, K, ...
    'MaxIter', 1000, 'Replicates', 20, 'Display', 'final');

% 将聚类结果映射回图像
change_map = reshape(idx, M, N);

% 确定哪个类别是变化类(假设变化类特征值更大)
% 计算每个聚类的平均特征值
cluster_means = zeros(K, 1);
for i = 1:K
    cluster_means(i) = mean(mean(cluster_features(idx==i, :)));
end

% 特征值较大的聚类为变化类
[~, change_cluster] = max(cluster_means);

% 创建二值变化图
binary_change = (change_map == change_cluster);

%% 6. 后处理:形态学滤波
fprintf('进行后处理...\n');

% 6.1 去除小区域(面积滤波)
min_area = 50;  % 最小变化区域面积
binary_change_cleaned = bwareaopen(binary_change, min_area);

% 6.2 闭运算填充小孔
se = strel('disk', 3);
binary_change_closed = imclose(binary_change_cleaned, se);

% 6.3 开运算去除孤立点
binary_change_opened = imopen(binary_change_closed, se);

%% 7. 结果显示与评估
figure('Position', [100, 100, 1500, 600]);

% 7.1 原始聚类结果
subplot(2,3,1);
imagesc(change_map);
colormap(gca, [0 0 0; 1 1 1]);  % 黑白显示
title('K均值聚类结果');
axis image; axis off;

% 7.2 二值变化图
subplot(2,3,2);
imshow(binary_change);
title('原始二值变化图');

% 7.3 面积滤波后
subplot(2,3,3);
imshow(binary_change_cleaned);
title(sprintf('面积滤波后(最小面积=%d)', min_area));

% 7.4 形态学处理后
subplot(2,3,4);
imshow(binary_change_opened);
title('形态学处理后');

% 7.5 叠加显示
subplot(2,3,5);
imshow(T1_filtered, []);
hold on;
% 将变化区域以红色半透明叠加
red_mask = cat(3, ones(M,N), zeros(M,N), zeros(M,N));
h = imshow(red_mask);
set(h, 'AlphaData', binary_change_opened*0.5);
title('变化区域叠加(红色)');

% 7.6 变化统计
subplot(2,3,6);
change_percentage = sum(binary_change_opened(:)) / (M*N) * 100;
pie([change_percentage, 100-change_percentage], {'变化区域', '未变化区域'});
title(sprintf('变化区域占比: %.2f%%', change_percentage));

%% 8. 定量评估(如果有真实变化图)
% 假设有真实变化图 ground_truth
% ground_truth = imread('ground_truth.tif'); % 替换为真实变化图
% if exist('ground_truth', 'var')
%     % 确保二值化
%     ground_truth = im2bw(ground_truth, 0.5);
%     
%     % 计算评估指标
%     TP = sum(sum(binary_change_opened & ground_truth));  % 真阳性
%     FP = sum(sum(binary_change_opened & ~ground_truth)); % 假阳性
%     FN = sum(sum(~binary_change_opened & ground_truth)); % 假阴性
%     TN = sum(sum(~binary_change_opened & ~ground_truth));% 真阴性
%     
%     accuracy = (TP+TN) / (TP+FP+FN+TN);
%     precision = TP / (TP+FP);
%     recall = TP / (TP+FN);
%     F1 = 2 * precision * recall / (precision + recall);
%     
%     fprintf('\n========== 评估结果 ==========\n');
%     fprintf('准确率: %.4f\n', accuracy);
%     fprintf('精确率: %.4f\n', precision);
%     fprintf('召回率: %.4f\n', recall);
%     fprintf('F1分数: %.4f\n', F1);
% end

%% 9. 保存结果
% imwrite(binary_change_opened, 'change_detection_result.tif');
% save('pca_features.mat', 'score', 'coeff', 'latent', 'explained');
% save('clustering_result.mat', 'idx', 'centers', 'binary_change_opened');

fprintf('\n变化检测完成!\n');

%% 辅助函数:Lee滤波(SAR影像去噪)
function filtered = lee_filter(image, window_size)
    % Lee滤波实现
    % image: 输入SAR影像
    % window_size: 滤波窗口大小(奇数)
    
    [M, N] = size(image);
    filtered = zeros(M, N);
    half_win = floor(window_size/2);
    
    % 扩展图像边界
    image_padded = padarray(image, [half_win, half_win], 'symmetric');
    
    for i = 1:M
        for j = 1:N
            % 提取局部窗口
            window = image_padded(i:i+window_size-1, j:j+window_size-1);
            
            % 计算局部均值和方差
            mean_local = mean(window(:));
            var_local = var(window(:));
            
            % 计算噪声方差(假设为图像方差的1%)
            noise_var = 0.01 * var(image(:));
            
            % Lee滤波系数
            if var_local > noise_var
                k = 1 - noise_var / var_local;
            else
                k = 0;
            end
            
            % 滤波输出
            filtered(i,j) = mean_local + k * (image(i,j) - mean_local);
        end
    end
end

三、算法详细说明与优化

3.1 PCA在SAR变化检测中的作用

PCA变换步骤:

  1. 特征标准化
  2. 计算协方差矩阵
  3. 特征值分解
  4. 选择主成分:按特征值降序排列,选择前k个特征向量
  5. 投影

在变化检测中的优势:

3.2 K均值聚类参数优化

%% K均值聚类优化:自动确定最佳K值
function [optimal_K, silhouette_scores] = optimize_kmeans(features, max_K)
    % 使用轮廓系数确定最佳聚类数
    % features: 输入特征矩阵 (n_samples × n_features)
    % max_K: 最大聚类数
    
    silhouette_scores = zeros(max_K-1, 1);
    
    for K = 2:max_K
        [idx, centers] = kmeans(features, K, ...
            'MaxIter', 1000, 'Replicates', 10, 'Display', 'off');
        
        % 计算轮廓系数
        s = silhouette(features, idx);
        silhouette_scores(K-1) = mean(s);
        
        fprintf('K=%d, 轮廓系数=%.4f\n', K, silhouette_scores(K-1));
    end
    
    [~, optimal_K_idx] = max(silhouette_scores);
    optimal_K = optimal_K_idx + 1;
    
    % 绘制轮廓系数曲线
    figure;
    plot(2:max_K, silhouette_scores, 'bo-', 'LineWidth', 2);
    xlabel('聚类数 K');
    ylabel('平均轮廓系数');
    title('轮廓系数法确定最佳聚类数');
    grid on;
    hold on;
    plot(optimal_K, silhouette_scores(optimal_K-1), 'r*', 'MarkerSize', 15);
    legend('轮廓系数', sprintf('最佳K=%d', optimal_K));
end

3.3 改进的PCA-Kmeans算法

%% 改进版:结合多尺度特征的PCA-Kmeans
function change_map = improved_pca_kmeans(T1, T2)
    % 输入:两时相SAR影像
    % 输出:变化检测结果
    
    [M, N] = size(T1);
    
    %% 多尺度特征提取
    scales = [3, 5, 7, 9];  % 多尺度窗口
    n_scales = length(scales);
    n_features = 4;  % 每个尺度的特征数
    total_features = n_scales * n_features;
    
    % 初始化特征矩阵
    features = zeros(M*N, total_features);
    feature_idx = 1;
    
    for s = 1:n_scales
        window_size = scales(s);
        
        % 多尺度滤波
        T1_filtered = multiscale_filter(T1, window_size);
        T2_filtered = multiscale_filter(T2, window_size);
        
        % 提取多尺度特征
        features(:, feature_idx) = abs(log(T2_filtered(:)+eps) - log(T1_filtered(:)+eps));
        features(:, feature_idx+1) = abs(T2_filtered(:) - T1_filtered(:));
        
        % 局部统计特征
        T1_mean = imfilter(T1_filtered, fspecial('average', window_size), 'replicate');
        T2_mean = imfilter(T2_filtered, fspecial('average', window_size), 'replicate');
        features(:, feature_idx+2) = abs(T2_mean(:) ./ (T1_mean(:)+eps));
        
        T1_var = stdfilt(T1_filtered).^2;
        T2_var = stdfilt(T2_filtered).^2;
        features(:, feature_idx+3) = abs(log(T2_var(:)+eps) - log(T1_var(:)+eps));
        
        feature_idx = feature_idx + 4;
    end
    
    %% 加权PCA
    % 标准化
    features_zscore = zscore(features);
    
    % 计算特征权重(基于特征方差)
    feature_var = var(features_zscore);
    weights = feature_var / sum(feature_var);
    
    % 加权PCA
    W = diag(sqrt(weights));
    X_weighted = features_zscore * W;
    [coeff, score, latent] = pca(X_weighted);
    
    %% 自适应K均值聚类
    % 使用前3个主成分
    pc_features = score(:,1:3);
    
    % 自适应确定聚类数(2-5类)
    eval = evalclusters(pc_features, 'kmeans', 'CalinskiHarabasz', 'KList', 2:5);
    optimal_K = eval.OptimalK;
    
    % 执行K均值聚类
    [idx, centers] = kmeans(pc_features, optimal_K, ...
        'MaxIter', 1000, 'Replicates', 20, 'Display', 'off');
    
    %% 变化类识别
    % 基于特征空间距离识别变化类
    change_map = identify_change_class(idx, centers, pc_features);
    
    %% 后处理
    change_map = postprocess_change_map(change_map);
end

%% 辅助函数:多尺度滤波
function filtered = multiscale_filter(image, window_size)
    % 多尺度均值滤波
    h = fspecial('average', window_size);
    filtered = imfilter(image, h, 'replicate');
end

%% 辅助函数:变化类识别
function change_map = identify_change_class(idx, centers, features)
    % 基于聚类中心距离识别变化类
    
    [M, N] = size(features);
    n_clusters = size(centers, 1);
    
    % 计算每个像素到所有聚类中心的距离
    distances = zeros(M, n_clusters);
    for i = 1:n_clusters
        diff = features - repmat(centers(i,:), M, 1);
        distances(:,i) = sqrt(sum(diff.^2, 2));
    end
    
    % 找到距离最大的聚类(变化类)
    [~, change_cluster] = max(std(distances, 0, 1));
    
    % 创建变化图
    change_map = (idx == change_cluster);
    change_map = reshape(change_map, sqrt(M), sqrt(M));
end

%% 辅助函数:后处理
function result = postprocess_change_map(change_map)
    % 形态学后处理
    
    % 1. 去除小区域
    min_area = 100;
    result = bwareaopen(change_map, min_area);
    
    % 2. 填充小孔
    result = imfill(result, 'holes');
    
    % 3. 平滑边界
    se = strel('disk', 2);
    result = imopen(result, se);
    result = imclose(result, se);
end

四、性能评估与对比

4.1 评估指标计算

%% 变化检测性能评估
function [metrics, confusion_matrix] = evaluate_change_detection(result, ground_truth)
    % result: 检测结果(二值图)
    % ground_truth: 真实变化图(二值图)
    
    % 确保二值化
    result = im2bw(result, 0.5);
    ground_truth = im2bw(ground_truth, 0.5);
    
    % 计算混淆矩阵
    TP = sum(sum(result & ground_truth));      % 真阳性
    FP = sum(sum(result & ~ground_truth));     % 假阳性
    FN = sum(sum(~result & ground_truth));     % 假阴性
    TN = sum(sum(~result & ~ground_truth));    % 真阴性
    
    confusion_matrix = [TP, FP; FN, TN];
    
    % 计算各项指标
    accuracy = (TP + TN) / (TP + FP + FN + TN);
    precision = TP / (TP + FP);
    recall = TP / (TP + FN);
    specificity = TN / (TN + FP);
    F1_score = 2 * precision * recall / (precision + recall);
    kappa = calculate_kappa(confusion_matrix);
    
    % 返回结果
    metrics = struct(...
        'Accuracy', accuracy, ...
        'Precision', precision, ...
        'Recall', recall, ...
        'Specificity', specificity, ...
        'F1_Score', F1_score, ...
        'Kappa', kappa, ...
        'TP', TP, 'FP', FP, 'FN', FN, 'TN', TN);
    
    % 显示结果
    fprintf('========== 性能评估结果 ==========\n');
    fprintf('准确率 (Accuracy):   %.4f\n', accuracy);
    fprintf('精确率 (Precision):  %.4f\n', precision);
    fprintf('召回率 (Recall):     %.4f\n', recall);
    fprintf('特异度 (Specificity):%.4f\n', specificity);
    fprintf('F1分数:              %.4f\n', F1_score);
    fprintf('Kappa系数:           %.4f\n', kappa);
    fprintf('\n混淆矩阵:\n');
    fprintf('          预测变化   预测未变化\n');
    fprintf('真实变化   %4d       %4d\n', TP, FN);
    fprintf('真实未变化 %4d       %4d\n', FP, TN);
end

%% 计算Kappa系数
function kappa = calculate_kappa(confusion_matrix)
    TP = confusion_matrix(1,1);
    FP = confusion_matrix(1,2);
    FN = confusion_matrix(2,1);
    TN = confusion_matrix(2,2);
    
    total = TP + FP + FN + TN;
    
    % 观测一致性
    Po = (TP + TN) / total;
    
    % 期望一致性
    Pe = ((TP+FP)*(TP+FN) + (FN+TN)*(FP+TN)) / (total^2);
    
    % Kappa系数
    kappa = (Po - Pe) / (1 - Pe);
end

4.2 与其他方法对比

%% 对比不同变化检测方法
function compare_methods(T1, T2, ground_truth)
    % 对比PCA-Kmeans与其他传统方法
    
    methods = {'PCA-Kmeans', 'CVA', 'IRMAD', 'Deep Learning'};
    results = cell(length(methods), 1);
    
    %% 1. PCA-Kmeans方法(本文方法)
    fprintf('执行PCA-Kmeans方法...\n');
    result_pca_kmeans = improved_pca_kmeans(T1, T2);
    results{1} = result_pca_kmeans;
    
    %% 2. 变化向量分析(CVA)
    fprintf('执行CVA方法...\n');
    result_cva = cva_method(T1, T2);
    results{2} = result_cva;
    
    %% 3. 迭代重加权多元变化检测(IR-MAD)
    fprintf('执行IR-MAD方法...\n');
    result_irmad = irmad_method(T1, T2);
    results{3} = result_irmad;
    
    %% 4. 评估所有方法
    figure('Position', [100, 100, 1500, 800]);
    
    for i = 1:length(methods)
        % 计算评估指标
        [metrics, ~] = evaluate_change_detection(results{i}, ground_truth);
        
        % 显示结果
        subplot(2, 4, i);
        imshow(results{i});
        title(sprintf('%s\nF1=%.3f', methods{i}, metrics.F1_Score));
        
        % 绘制ROC曲线
        subplot(2, 4, i+4);
        [fpr, tpr] = calculate_roc(results{i}, ground_truth);
        plot(fpr, tpr, 'LineWidth', 2);
        hold on;
        plot([0 1], [0 1], 'k--');
        xlabel('假阳性率');
        ylabel('真阳性率');
        title(sprintf('%s ROC曲线\nAUC=%.3f', methods{i}, trapz(fpr, tpr)));
        grid on;
        axis equal;
        xlim([0 1]); ylim([0 1]);
    end
    
    sgtitle('不同变化检测方法对比');
end

%% CVA方法实现
function result = cva_method(T1, T2)
    % 变化向量分析
    diff = T2 - T1;
    magnitude = sqrt(sum(diff.^2, 3));  % 对于多波段
    
    % 自动阈值选择(Otsu)
    threshold = graythresh(magnitude);
    result = magnitude > threshold;
end

%% IR-MAD方法实现(简化版)
function result = irmad_method(T1, T2)
    % 迭代重加权多元变化检测
    % 注:这是简化实现,完整IR-MAD更复杂
    
    [M, N, ~] = size(T1);
    
    % 将影像转换为向量
    X1 = reshape(T1, M*N, []);
    X2 = reshape(T2, M*N, []);
    
    % 计算差异
    diff = X2 - X1;
    
    % 计算MAD变量
    [coeff, ~] = pca(diff);
    mad_variables = diff * coeff;
    
    % 使用第一主成分进行变化检测
    mad1 = reshape(mad_variables(:,1), M, N);
    
    % 自动阈值
    threshold = 2 * std(mad1(:));  % 2倍标准差
    result = abs(mad1) > threshold;
end

%% 计算ROC曲线
function [fpr, tpr] = calculate_roc(result, ground_truth)
    % 生成ROC曲线
    
    thresholds = linspace(0, 1, 100);
    fpr = zeros(size(thresholds));
    tpr = zeros(size(thresholds));
    
    for i = 1:length(thresholds)
        binary_result = result > thresholds(i);
        
        TP = sum(sum(binary_result & ground_truth));
        FP = sum(sum(binary_result & ~ground_truth));
        FN = sum(sum(~binary_result & ground_truth));
        TN = sum(sum(~binary_result & ~ground_truth));
        
        fpr(i) = FP / (FP + TN);
        tpr(i) = TP / (TP + FN);
    end
end

参考代码 运用主成分分析法和K均值聚类法来进行SAR影像变化检测 www.youwenfan.com/contentcnv/79123.html

五、实际应用建议

5.1 参数调优指南

参数 推荐值 调整建议
PCA主成分数 累计方差>95% 根据特征值陡坡图选择
K均值聚类数 2-5 使用轮廓系数或肘部法则确定
最小变化区域 50-100像素 根据影像分辨率调整
形态学核大小 3×3 或 5×5 根据噪声水平调整
Lee滤波窗口 5×5 或 7×7 大窗口去噪强但细节损失多

5.2 处理不同类型SAR影像

%% 针对不同SAR影像类型的参数设置
function params = get_parameters_for_sar_type(sar_type)
    % 根据SAR影像类型返回推荐参数
    
    switch lower(sar_type)
        case 'sentinel-1'
            params = struct(...
                'filter_size', 5, ...
                'pca_components', 3, ...
                'min_area', 50, ...
                'morph_size', 3);
            
        case 'terrasar-x'
            params = struct(...
                'filter_size', 7, ...
                'pca_components', 4, ...
                'min_area', 100, ...
                'morph_size', 5);
            
        case 'radarsat-2'
            params = struct(...
                'filter_size', 5, ...
                'pca_components', 3, ...
                'min_area', 75, ...
                'morph_size', 4);
            
        otherwise
            params = struct(...
                'filter_size', 5, ...
                'pca_components', 3, ...
                'min_area', 50, ...
                'morph_size', 3);
    end
end

5.3 批量处理与自动化

%% 批量处理多对SAR影像
function batch_process_sar_change_detection(data_folder, output_folder)
    % 批量处理文件夹中的所有SAR影像对
    
    % 获取所有影像文件
    files = dir(fullfile(data_folder, '*.tif'));
    file_names = {files.name};
    
    % 按时间排序
    file_names = sort(file_names);
    
    % 逐对处理
    for i = 1:2:length(file_names)-1
        fprintf('处理影像对: %s 和 %s\n', file_names{i}, file_names{i+1});
        
        % 读取影像
        T1 = imread(fullfile(data_folder, file_names{i}));
        T2 = imread(fullfile(data_folder, file_names{i+1}));
        
        % 变化检测
        change_map = improved_pca_kmeans(T1, T2);
        
        % 保存结果
        output_name = sprintf('change_%s_to_%s.tif', ...
            file_names{i}(1:end-4), file_names{i+1}(1:end-4));
        imwrite(change_map, fullfile(output_folder, output_name));
        
        % 生成报告
        generate_report(T1, T2, change_map, output_folder, output_name);
    end
    
    fprintf('批量处理完成!共处理了%d对影像。\n', floor(length(file_names)/2));
end

六、总结

6.1 PCA-Kmeans方法优势

  1. 无需阈值:Kmeans自动确定变化/未变化分类
  2. 鲁棒性强:PCA降维抑制噪声,提高检测稳定性
  3. 多特征融合:可结合多种差异特征,提高检测精度
  4. 计算效率高:相比深度学习方法,计算资源需求低

6.2 局限性及改进方向

  1. 局限性

    • 对初始聚类中心敏感
    • 假设变化区域在特征空间中是紧凑的
    • 对复杂变化模式(如渐进变化)检测能力有限
  2. 改进方向

    • 结合深度学习特征
    • 引入空间上下文信息(MRF、CRF)
    • 使用模糊聚类(FCM)替代Kmeans
    • 集成多时相序列分析

6.3 实际应用建议

  1. 预处理至关重要:确保影像精确配准和辐射校正
  2. 参数需本地化:根据具体区域和影像特性调整参数
  3. 结合目视解译:自动检测结果需人工验证
  4. 考虑季节影响:植被季节变化可能被误检为变化

专注于matlab/simulink,电子电路,编程