基于主成分变换(PCA)的图像融合

参考资料:https://blog.csdn.net/u013165921/article/details/78339942
基于 IHS 变换和主成分分析变换的图像融合

PCA变换
PCA变换也称霍特林变换或K-L变换,是一种基于信息量的正交线性变换,该变换主要是采用线性投影的方法将数据投影到新的坐标空间中,从而使得新的成分按信息量分布,第一主成分包含的信息量最大,变换后各主成分分量彼此不相关,且随着主成分编号的增加该分量包含的信息量减小。PCA变换后图像的信息主要集中在前几个主成分分量中,在变换域中丢弃信息量小的主成分分量,将原始的海量高光谱数据变换为少量的几个成分,在降低数据维数的同时,最大限度地保持了原始数据的信息。PCA 广泛应用于图像压缩、图像增强、图像编码、随机噪声信号的去除及图像旋转等各种应用。
对图像数据进行主成分变换首先需要计算出一个标准变换矩阵,通过变换矩阵使图像数据转换成一组新的图像数据-主成分数据,从而提高图像的主成分特征,由此构造出的每个新特征都是原特征的线性函数。其变换公式可以用下式表示:
基于主成分变换(PCA)的图像融合_第1张图片
若 T 是正交矩阵,并且由待变换图像的数据矩阵的协方差矩阵 C 的特征矢量所组成,则此变换称为 K-L 变换,称变换的数据矩阵的每一行矢量为 KL 变换的一个主分量。对低分辨率多光谱图像与高空间分辨率图像融合时,主成分变换的融合方法的
基本思想是:首先对多光谱图像进行主成分变换,然后用拉伸的高空间分辨率图像代替第一主分量进行逆主分量变换,得到融合的图像。
基于主成分变换(PCA)的图像融合_第2张图片
计算步骤

PCA算法融合步骤如下
基于主成分变换(PCA)的图像融合_第3张图片
PCA 变换融合方法的主要优点是:
融合后的图像光谱特性保持好,尤其在波段数较多的情况下;
缺点是:
由于要对自相关矩阵求特征值和特征向量,计算量非常大,实时性比较差。本文采用替代法进行 PCA 变换融合,因为主成分变换后的前几个主分量包含了主要的地物信息,噪声相对较少;而随着信息量的逐渐减少,最后的主分量几乎全部是噪声信息。因此,主成分突出了主要信息,抑制了噪声,达到了图像增强的目的。
基于PCA的图像融合方法主要应用于遥感图像融合领域,适用于多光谱图像与全色图像的融合,PCA图像融合方法将多光谱图像的多个波段看作多维数据集,通过对该数据集进行PCA变换得到多个主成分分量。

% 基于PCA变换的图像融合方法

up = imread('pic/high.jpg');
low = imread('pic/low.jpg');
subplot(2,2,1);imshow(up);title('高分辨率图像');
subplot(2,2,2);imshow(low);title('低分辨率图像');

[up_R] = double(up(:,:,1));
[up_G] = double(up(:,:,2));
[up_B] = double(up(:,:,3));

[low_R] = double(low(:,:,1));
[low_G] = double(low(:,:,2));
[low_B] = double(low(:,:,3));

[M,N,color] = size(up);

up_Mx = 0;
low_Mx = 0;
for i = 1:M
    for j = 1:N
        up_S = [up_R(i,j),up_G(i,j),up_B(i,j)];         % 生成由RGB组成的三维列向量
        up_Mx = up_Mx + up_S;                           % 叠加计算RGB各列向量的总和

        low_S = [low_R(i,j),low_G(i,j),low_B(i,j)];     
        low_Mx = low_Mx + low_S;
    end
end
up_Mx = up_Mx/(M * N);                                  % 计算三维列向量的平均值
low_Mx = low_Mx/(M * N);

up_Cx = 0;
low_Cx = 0;
for i = 1:M
    for j = 1:N
        up_S = [up_R(i,j),up_G(i,j),up_B(i,j)]';        % 矩阵转置
        up_Cx = up_Cx + up_S * up_S';                          

        low_S = [low_R(i,j),low_G(i,j),low_B(i,j)]';     
        low_Cx = low_Cx + low_S * low_S';
    end
end
up_Cx = up_Cx/(M * N) - up_Mx * up_Mx';                 % 计算协方差矩阵
low_Cx = low_Cx/(M * N) - low_Mx * low_Mx';

[up_A,up_latent] = eigs(up_Cx);                         % 协方差矩阵的特征向量组成的矩阵
[low_A,low_latent] = eigs(low_Cx);                      % 即PCA变换的系数矩阵,特征值

for i = 1 : M
    for j = 1 : N
       up_X = [up_R(i,j),up_G(i,j),up_G(i,j)]';        % 生成由R,G, B组成的三维列
       up_Y = up_A'*up_X;                              % 每个象素点进行PCA变换正变换
       up_Y = up_Y';
       up_R(i,j) = up_Y(1);                            % 高分辨率图片的第1主分量
       up_G(i,j) = up_Y(2);                            % 高分辨率图片的第2主分量
       up_B(i,j) = up_Y(3);                            % 高分辨率图片的第3主分量

       low_X = [low_R(i,j),low_G(i,j),low_G(i,j)]';
       low_Y = low_A'*low_X;
       low_Y = low_Y';
       low_R(i,j) = low_Y(1);                          % 低分辨率图片的第1主分量
       low_G(i,j) = low_Y(2);                          % 低分辨率图片的第2主分量
       low_B(i,j) = low_Y(3);                          % 低分辨率图片的第3主分量
   end
end

for i = 1 : M
    for j = 1 : N
       up_Y = [up_R(i,j),up_G(i,j),up_B(i,j)]';         % 生成由R,G, B组成的三维列向量 
       up_X = up_A*up_Y;                                % 每个象素点进行PCA变换反变换
       up_X = up_X';
       up_r(i,j) = up_X(1);
       up_g(i,j) = up_X(2);
       up_b(i,j) = up_X(3);

       low_Y = [up_R(i,j),low_G(i,j),low_B(i,j)]';
       low_X = low_A*low_Y;
       low_X = low_X';
       low_r(i,j) = low_X(1);
       low_g(i,j) = low_X(2);
       low_b(i,j) = low_X(3);
   end
end

RGB_up(:,:,1)=up_r;
RGB_up(:,:,2)=up_g;
RGB_up(:,:,3)=up_b;

RGB_low(:,:,1)=low_r;
RGB_low(:,:,2)=low_g;
RGB_low(:,:,3)=low_b;

subplot(2,2,3);imshow(uint8(RGB_up));title('高分辨率PCA变换图像');
subplot(2,2,4);imshow(uint8(RGB_low));title('低分辨率PCA变换图像');


你可能感兴趣的:(像素级图像融合方法总结)