function Y= nmfandlwt1(I1,I2)
%wnmf和提升小波变换相结合的图像融合
I1=imread('0.0.bmp');
I2=imread('1.0.bmp');
v1=double(I1);
v2=double(I2);
LS=liftwave('9.7');
[cA11 cH11 cV11 cD11]=lwt2(v1,LS);
[cA21 cH21 cV21 cD21]=lwt2(v2,LS);
[r c]=size(cA11);
%将矩阵逐行排列成列向量
cod_cA11=wcodemat(cA11,max(abs(cA11(:))));
cod_cA21=wcodemat(cA21,max(abs(cA21(:))));
v11=cod_cA11(:);
v21=cod_cA21(:);
V=[v11,v21];
[W0 H0]=wnmf(V,1,0.7);
W0=reshape(W0,r,c);
minp=min(W0(:));
maxp=max(W0(:));
W1=imadjust(W0,[minp maxp],[0 1]);
W1=im2uint8(W1);
if abs(cH11)>abs(cH21)
cH=cH11;
else
cH=cH21;
end
if abs(cV11)>abs(cV21)
cV=cV11
else
cV=cV21
end
if abs(cD11)>abs(cD21)
cD=cD11
else
cD=cD21
end
W1=double(W1);
X=ilwt2(W1,cH,cV,cD,LS);
imshow(X,[]);
function [W H]=nmf( V, rdim)
% 对V矩阵做非负矩阵分解 W为基矩阵 H为权重矩阵 ridm 为基向量个数
if min(V(:))<0, error('Negative values in data!'); end % V非负
V=double(V);
%V = V/max(V(:));% 为了避免潜在的数据溢出
vdim = size(V,1);%n
samples = size(V,2);%m
% 初始化W,H为一随即的正矩阵
W = abs(randn(vdim,rdim));
W=double(W);
W=W(:);
H = abs(randn(1,samples));
% 将W归一化
W = W./(ones(vdim,1)*sum(W,1));
% 初始时的目标函数值
%objhistory=sum(sum((V-W*H).^2));
objhistory = sum(sum((V.*log(W*H)) - (W*H))) ;
timestarted = clock;
iter = 0; % 迭代次数
for iter=1: 100
% 打印出过程
fprintf('[%d]: %.5f \n',iter,objhistory(end));
% 每迭代5次就将迭代结果保存
if rem(iter,5)==0,
elapsed = etime(clock,timestarted);%总共运行的时间
fprintf('Saving...');
save('W','H','iter','objhistory','elapsed');
fprintf('Done!\n');
end
% 原来的W,H值
Wold = W;
Hold = H;
% 迭代
H=H.*(W'*((V+eps)./(W*H+eps)));
W=W.*(((V+eps)./(W*H+eps))*H');
W = W./(ones(vdim,1)*sum(W,1));
% 目标函数
%newobj = sum(sum((V.*log(V./(W*H+eps))) - W*H));
%newobj=sum(sum((V-W*H).^2));
newobj= sum(sum((V.*log(W*H)) - (W*H))) ;
objhistory = [objhistory newobj];
end
%figure,imshow(I2)