特别鸣谢程序来源:
1 【图像融合】拉普拉斯金字塔融合
2 【图像融合】高斯金字塔
以及前期基于该程序有一些解读,[学习笔记-图像处理篇]拉普拉斯金字塔图像融合法,是对应的。
注:
1)该程序基于matlab实现
2)仅可处理灰度图,如果是RGB,请转为灰度图
主程序
x0 = imread('color.bmp');
x1= rgb2gray(x0);
x2 = imread('thermal.bmp');
y = lapfusion(x1,x2,4);
subplot(1,3,1);imshow(x1);title('源图像1');
subplot(1,3,2);imshow(x2);title('源图像2');
subplot(1,3,3);imshow(uint8(y));title('Laplace金字塔融合图像');
%若要单独保存融合后图像,可使用下面语句
%imshow(uint8(y));
%imwrite(uint8(y),'lap_result_matlab.jpg');
子函数共有4个
function y = lapfusion( x1,x2,N )
%函数y = lapfusion( x1,x2,N )的功能是基于图像的laplace塔形分解实现两幅图像的融合
%输入参数:
% x1----原图像1
% x2----原图像2
% N----laplace塔形的层数
%输出参数:
% y----两幅原图像融合后的结果
%-----------------------------------------------%
x1=double(x1);
x2=double(x2);
L1=lap(x1,N); %分别建立两幅原图像的Laplace金字塔
L2=lap(x2,N);
temp1=[]; %temp1每次存储x1图像得到的Laplace金字塔L1的一层
temp2=[]; %temp2每次存储x2图像得到的Laplace金字塔L2的一层
L={}; %L用来存储两幅图像融合后的Laplace金字塔
for i=1:N %分别对Laplace金字塔的每一层进行融合
temp1=L1{1,i};
temp2=L2{1,i};
temp=[];
[m,n]=size(temp1);
for j=1:m
for k=1:n
if temp1(j,k)>=temp2(j,k) %基于选像素较大者的融合规则对两幅图像进行融合
temp(j,k)=temp1(j,k);
else
temp(j,k)=temp2(j,k);
end;
end
end
L=[L,temp]; %L保存融合后的每一层图像
end
y=recon(L); %调用recon函数由融合后的Laplace金字塔恢复原图像
end
function g=lap(x,N)
%函数g=lap(x,N)对输入原图像x建立N层Laplace金字塔
%输入参数:
% x----输入原图像
% N----要建立的laplace金字塔的层数
%输出参数:
% g----建立的laplace金字塔,g={l0,l1,l2,...,1n},l0表示Laplace金字塔的最底层,
% ln表示Laplace金字塔的最高层
%------------------------------------------------------------%
w=gaosi(x,N); %调用gaosi函数首先建立原图像x的高斯金字塔
N=length(w); %求出高斯金字塔的层数
g={};
for i=1:N-1 %除高斯金字塔的最高层外,其他每层图像都执行下面的操作
temp1=w{1,i}-expand(w{1,i+1}); %对上一层图像调用expand函数,将本层图像减去其结果
g=[g,temp1];
end
g=[g,w{1,N}];
end
function y= expand(x)
%函数y=expand(x)功能:首先对输入源隔行隔列插值,然后将插值结果与w卷积得到输出结果y
%输入参数:
% x-----输入图像
%输出参数:
% y----先将输入图像x插值然后与w卷积得到的结果
%----------------------------------------------------------%
[row,col]=size(x);
w=1/256*[1,4,6,4,1;4,16,24,16,4;6,24,36,24,6;4,16,24,16,4;1,4,6,4,1];
for i=1:row
for j=1:col
temp(2*i-1,2*j-1)=x(i,j); %对输入源进行隔行隔列的插值
temp(2*i,2*j)=0;
end
end
y=4*conv2(temp,w,'same'); %将插值结果与w进行卷积
end
function G= recon( g )
%函数G=recon(g)的功能是由图像的laplace金字塔恢复原图像
%输入参数:
% g----图像的laplace金字塔
%输出参数:
% G----通过对输入的Laplace金字塔g重建得到的源图像
%------------------------------------%
N=length(g); %求出Laplace金字塔的层数
r={g{1,1}};
G=g{1,1}; %将Laplace金字塔的最底层赋给G
for i=N:-1:2 %除Laplace金字塔的最底层,对应其他第i层调用i-1次expand函数
%(例如第2层调用1次,第3层调用2次...),每一层最后得到的尺寸都和最底层相同
temp1=g{1,i};
for j=1:i-1
temp1=expand(temp1);
end
r=[r,temp1]; %将每层得到的结果存入r中
end
for i=2:N
G=G+r{1,i}; %输出G就是将Laplace每一层执行上面的操作得到的结果相加
end
end
function y= expand(x)
%函数y=expand(x)功能:首先对输入源隔行隔列插值,然后将插值结果与w卷积得到输出结果y
%输入参数:
% x-----输入图像
%输出参数:
% y----先将输入图像x插值然后与w卷积得到的结果
%----------------------------------------------------------%
[row,col]=size(x);
w=1/256*[1,4,6,4,1;4,16,24,16,4;6,24,36,24,6;4,16,24,16,4;1,4,6,4,1];
for i=1:row
for j=1:col
temp(2*i-1,2*j-1)=x(i,j); %对输入源进行隔行隔列的插值
temp(2*i,2*j)=0;
end
end
y=4*conv2(temp,w,'same'); %将插值结果与w进行卷积
end
function w=gaosi(x,N)
%函数w=gaosi(f,N)的功能是建立原图像f的N层高斯金字塔
%输入参数:
% x----输入原图像
% N----所要建立高斯金字塔的层数
%输出参数:
% w----高斯金字塔,w={G0,G1,G2,...,Gn},其中G0表示高斯金字塔的最底层,Gn表示高斯金字塔的最高层
%--------------------------------------%
x=double(x);
w={x}; %原图像作为高斯金字塔的最底层
for i=1:N-1
a=reduce(x);%调用reduce函数得到上一层图像
w=[w,a]; %每一层图像存入w中
x=a; %每次循环的结果作为下次循环reduce函数的输入
end
end
function y=reduce(x)
%函数y=reduce(x)的功能是实现输入图像x与w的卷积,然后进行降采样得到输出y
%输入参数:
% x----输入的图像
%输出参数:
% y----输出的图像,尺寸是输入的的一半,即隔行隔列降采样
%-------------------------------------------------------------%
[row,col]=size(x);
w=1/256*[1,4,6,4,1;4,16,24,16,4;6,24,36,24,6;4,16,24,16,4;1,4,6,4,1];
temp=conv2(x,w,'same'); %输入图像x与w进行卷积
M=floor(row/2);
N=floor(col/2);
for i=1:M %隔行隔列降采样
for j=1:N
y(i,j)=temp(2*i,2*j);
end
end
end