基于主成分变换(PCA)的图像融合
参考资料:https://blog.csdn.net/u013165921/article/details/78339942
基于 IHS 变换和主成分分析变换的图像融合
PCA变换
PCA变换也称霍特林变换或K-L变换,是一种基于信息量的正交线性变换,该变换主要是采用线性投影的方法将数据投影到新的坐标空间中,从而使得新的成分按信息量分布,第一主成分包含的信息量最大,变换后各主成分分量彼此不相关,且随着主成分编号的增加该分量包含的信息量减小。PCA变换后图像的信息主要集中在前几个主成分分量中,在变换域中丢弃信息量小的主成分分量,将原始的海量高光谱数据变换为少量的几个成分,在降低数据维数的同时,最大限度地保持了原始数据的信息。PCA 广泛应用于图像压缩、图像增强、图像编码、随机噪声信号的去除及图像旋转等各种应用。
对图像数据进行主成分变换首先需要计算出一个标准变换矩阵,通过变换矩阵使图像数据转换成一组新的图像数据-主成分数据,从而提高图像的主成分特征,由此构造出的每个新特征都是原特征的线性函数。其变换公式可以用下式表示:
若 T 是正交矩阵,并且由待变换图像的数据矩阵的协方差矩阵 C 的特征矢量所组成,则此变换称为 K-L 变换,称变换的数据矩阵的每一行矢量为 KL 变换的一个主分量。对低分辨率多光谱图像与高空间分辨率图像融合时,主成分变换的融合方法的
基本思想是:首先对多光谱图像进行主成分变换,然后用拉伸的高空间分辨率图像代替第一主分量进行逆主分量变换,得到融合的图像。
计算步骤
PCA算法融合步骤如下
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变换图像');
上一篇: 推荐一个手机应用开发的好的博客网站
下一篇: 屏幕后处理-饱和度,亮度,对比度处理