参考论文:Image Fusion technique using Multi-resolution singular Value decomposition
借鉴了现有代码
clear
close all
clc
x1= double(imread('image1.jpg'));
x2 = double(imread('image2.jpg'));
% 建议z为4,其中分块比整个图像直接奇异值矩阵替换融合要好,因为分块后可以提取局部重要性特征,而全局可能导致混乱
z =9 ;%每一块内像素点个数,如果值太多,需要m_svd注释掉部分图像,因为每多一个像素点会多一个特征多显示一张图像。
[t1,U1,z1] = m_svd(x1,z);
[t2,U2,z2] = m_svd(x2,z);
[m,~] = size(t1);
T =zeros(size(t1));
T(1,:) =(t1(1,:) +t2(1,:))/2;% 主要特征选择求平均
for i= 2:m % 其余选取t1和t2矩阵中绝对值最大的部分进行保留
D = (abs(t1(i,:))-abs(t2(i,:))) >= 0;
T(i,:)= D.*t1(i,:) + (~D).*t1(i,:);
end
% 然后左奇异矩阵也选择求取均值
U = (U1+U2)/2;
[m,n] = size(x1);
A = U * T; % 刚才是U'*A =T ,现在是U*T =A 相当于对T除以U得到融合后的数据A,但矩阵除法并没有定义。而是应该被视为通过 U 的逆进行变换,得到原矩阵,要求U正交
x = zeros(m*z1,n*z1); %放回去,但是由于分块时拉伸了,导致图像放大了z1倍,并且效果不好
for j = 1:n
for i = 1:m
x((i-1)*z1+(1:z1), (j-1)*z1+(1:z1)) = reshape(A(:,i+(j-1)*m),z1,z1);
%z过大,导致过于稀疏,图像重要信息无法得到
end
end
figure;
imshow(x,[])
title('正常放回去')
x = zeros(m,n); %把sum去掉,相当于显示T中第一行特征明显的数据,留着sum只是把多特征数据叠加成一个值,
for j = 1:n
for i = 1:m
x(i, j) = sum(A(:,i+(j-1)*m));
% z 过大,会导致在叠加特征显示时,非重要性数据冗余过多丢失,z小可能得到的特征不明确。
end
end
figure;
imshow(x,[])
title('多特征叠加放回')
function [T,U,zz] = m_svd(gray_img,z)
x = gray_img;
figure
imshow(x,[])
title('原图')
[m,n] = size(x);
% z = 4;% 每一块内像素点个数
zz = sqrt(z);% 每一块的长度
x = imresize(x,[m*zz,n*zz]);%因为后续缩放了,所以此处放大
[m,n] = size(x);
m = floor(m/zz);
n = floor(n/zz);
x = imresize(x,[m*zz,n*zz]);% 得到缩放后的图像用户分块
A = zeros(z,m*n);%初始化矩阵,矩阵中每一列为单个块内所有数据点
for j = 1:n
for i = 1:m
A(:,i + (j-1)*m) = reshape(x((i-1)*zz+(1:zz),(j-1)*zz+(1:zz)),z,1);%完成分块,试了一下以每一个像素点建立窗口分块和按间隔分块没看出区别
end
end
[U,S] = svd(A);%对分块后各块内像素点组成的矩阵进行奇异值分解,得到左奇异矩阵和奇异值矩阵
T = U*A;%将左奇异值矩阵与原矩阵相乘,获取原矩阵在最大特征值方向的投影矩阵T,使得不同列(样本)之间的特征明显。不确定这句话是否准确.
for i=1:z
% figure
% %显示每一个块内最明显的特征值,或者说明显程度?(个人理解不确定是否准确)强弱由于按照奇异值所以由强到弱,但是加[]进行拉伸显示了
% imshow(reshape(T(i,:),m,n),[])
% title('T矩阵第'+string(i)+'行数据的图像');
end
end