function [] = PCA_fusion(high,low)
%UNTITLED 基于PCA变换的图像融合
%high代表高分辨率全色影像;low代表多光谱影像
copy_low=low;
[h,w]=size(high);
band=3;
%首先进行重采样对多光谱低分影像
B1=Resampling_Bilinearint(low(:,:,1),h,w);
B2=Resampling_Bilinearint(low(:,:,2),h,w);
B3=Resampling_Bilinearint(low(:,:,3),h,w);
low=cat(3,B1,B2,B3);
low=double(low);
%将多光谱图像进行PCA正变换
pixels =h*w;
% reshape成pixels*channel:即每个波段的数值列在一列
low = reshape(low, [pixels,band]);
templow = low;
% 求各通道的均值
meanValue = mean(low,1);
% 数据去中心化
%B = repmat(A,M,N)—矩阵B是矩阵A的复制品,其中B的维度为[size(A,1)*M, size(A,2)*N]
%每一个元素减去其波段均值
low = low - repmat(meanValue,[pixels,1]);
% 求协方差矩阵
correlation = (low'*low)/pixels;
%求特征向量与特征值
%value--特征值从大到小排列
%vector--特征向量对应特征值排列,一列是一个特征向量
[vector ,value] = eig(correlation);
% 特征值和特征向量从大到小排序
vector = fliplr(vector);
% Y=AX(X中列为样本,若X行为样本,则Y =XA)
% PCA正变换
PC = templow*vector;
%用高分辫率影像代替第1主分量
%先将高分影像放到一列上
PCA1=reshape(high,[pixels,1]);
PC(:,1)=PCA1;
%将合成的数据进行PCA逆变换,获得高分辫率的多光谱融合图像
new_templow=PC*inv(vector);
new_low = reshape(new_templow, [h,w,band]);
new_low=uint8(new_low);
subplot(1,3,1);imshow(high);title('原始高分影像');
subplot(1,3,2);imshow(copy_low);title('原始多光谱影像');
subplot(1,3,3);imshow(new_low);title('PCA-RGB融合图像');
end
评论1