简介
第6节的内容是高斯金字塔,拉普拉斯金字塔还称为高斯-拉普拉斯金字塔。是因为它的生成方式如下:
①、生成高斯金字塔。
②、依次用高斯金字塔的k层减去k+1层。
③、生成的差值图像即为拉普拉斯金字塔。
使用拉普拉斯金字塔融合图像,是因为其能够明确表示图像在每一个尺度、每一个分辨率上的高频细节。这样,通过比较两幅源图像对应的尺度的图像,就能够将源图像各自突出的图像细节提取并保留、融合到融合图像中,尽可能丰富融合图像的信息量,达到较好的融合效果。
思路
具体究竟如何生成一个拉普拉斯金字塔,如下:
①、低通滤波(使用高斯核进行卷积)
②、下采样(生成上层滤波图像)
③、上采样(为了让上层图像分辨率与下层相等)
④、带通滤波(图像相减生成差值图像)
MATLAB实现
拉普拉斯金字塔生成
function lp=ftower(x,N)
w=fgaosi(x,N); %调用gaosi函数首先建立原图像x的高斯金字塔。
N=length(w); %求出高斯金字塔的层数。
lp={}; %lp是lap金字塔。
for i=1:N-1 %除高斯金字塔的最高层外,其他每层图像都执行下面的操作。
temp1=w{1,i}-expand(w{1,i+1}); %对上一层图像调用expand函数,再用本层图像减去其结果,生成差值图像。
lp=[lp,temp1];
%a=temp1;subplot(3,4,i);imshow(uint8(a));title(['LP金字塔第' num2str(i),'层']);
end
lp=[lp,w{1,N}]; %最高一层为高斯顶层。
end
function y=expand(x)
w=[1,4,6,4,1];
w=1/256*(w'*w);
temp=imresize(x,2);
y=conv2(temp,w,'same'); %将插值结果与w进行卷积。
end
MATLAB实现
思路
现在得到了一个N层的拉普拉斯金字塔,第N层为高斯N层,其余N-1层为差值图像。那么对这些层要设计融合规则:
1、假设分解至最高层N层(图像分辨率有限,不可能无限制分解下去,log2图像大小即为最高层数),那么建议使用像素值极大选择方案;假设分解到K层,K>N/2时,采用加权平均融合;K
主功能函数
function y=flap(x1,x2,N)
x1=double(x1);x2=double(x2);
L1=ftower(x1,N); %分别建立两幅原图像的Laplace金字塔。
L2=ftower(x2,N);
L={}; %L用来存储两幅图像融合后的Laplace金字塔。
for i=1:N-1 %分别对Laplace金字塔的1~N-1每一层进行融合。
temp1=L1{1,i}; %采用区域能量算法。
temp2=L2{1,i};
temp=fenergy(temp1,temp2);
L=[L,temp]; %L保存融合后的每一层图像。
end
a=L1{1,N}; %对第N层进行融合。
b=L2{1,N};
c=[];
c=ftidu(a,b); %调用梯度融合算法。
L=[L,c];
y=frestr(L); %调用restr函数由融合后的Laplace金字塔恢复原图像
end
梯度融合函数
function out=ftidu(x,y)
[xdx,xdy]=gradient(x);
s1=(xdx.^2+xdy.^2);
[ydx,ydy]=gradient(y);
s2=(ydx.^2+ydy.^2);
[rows,cols]=size(s1);
news=[];
for i=1:rows
for j=1:cols
if s1(i,j)>=s2(i,j)
news(i,j)=x(i,j);
else
news(i,j)=y(i,j);
end
end
out=news;
end
end
梯度算法如有需要我可以单独再讲一下,这里我提前编写好,没有注释,但是很好懂。
高斯金字塔
function y=fgaosi(x,N)
x=double(x);
y(1)={x};
for i=1:N-1
x=freduce(x);
a=x;
y(i+1)={a};
end
end
function t=freduce(x)
[row,col]=size(x);
w=[1,4,6,4,1];
w=1/256*(w'*w);
temp=conv2(x,w,'same');
M=floor(row/2);
N=floor(col/2);
for i=1:M
for j=1:N
t(i,j)=temp(2*i,2*j);
end
end
end
思路
按照差值图像金字塔的生成方式,逆推回去,就可以得到融合图像。最底层的融合图像和原图像大小一致;其后每一层的大小都为下一层大小的1/2,需要插值到与原图像尺寸一致的大小才可以进行相加;将这些图像矩阵直接相加就可以得到重构图像了。
MATLAB实现
function R=frestr(r)
N=length(r); %求出Laplace金字塔的层数。
re={r{1,1}};
R=r{1,1}; %将Laplace金字塔的最底层赋给G。
for i=N:-1:2 %除Laplace金字塔的最底层,对应其他第i层调用i-1次expand函数。
%(例如第2层调用1次,第3层调用2次...),每一层最后得到的尺寸都和最底层相同。
temp1=r{1,i};
for j=1:i-1
temp1=expand(temp1);
end
re=[re,temp1]; %将每层得到的结果存入re中。
end
for i=2:N
R=R+re{1,i}; %输出R就是将Laplace每一层执行上面的操作得到的结果相加。
end
end
function y=expand(x)
w=[1,4,6,4,1];
w=1/256*(w'*w);
temp=imresize(x,2);
y=conv2(temp,w,'same'); %将插值结果与w进行卷积
end
函数调用
clear;clc;
x1=imread('1.tif');
x2=imread('2.tif');
x1=imresize(x1,[512 512]);x2=imresize(x2,[512 512]); %本代码只适配了2整数次幂的分辨率。
y1=flap(x1,x2,4);y2=flap(x1,x2,5); %分别测试4、5层融合情况。
y1=uint8(y1);y2=uint8(y2);
subplot(2,2,1);imshow(x1);title('头发模糊');
subplot(2,2,2);imshow(x2);title('脸部模糊');
subplot(2,2,3);imshow(y1);title('4层Laplace金字塔融合图像');
subplot(2,2,4);imshow(y2);title('5层Laplace金字塔融合图像');
运行结果:
由论文:申晓华,杨国胜,张焕龙.改进的基于区域能量的图像融合方法【J】导弹与制导学报2006,26(4):279-281 所提出的方法,用拉普拉斯金字塔分解代替,得到实验结果:
注:
①、还有一个函数是能量算法的函数,在我上一节的代码中附有。本文所有代码加上能量算法代码即可完整运行。
②、将代码拆分是为了讲解和分别调用,如果已经看到这里了,想必分散的文件也可以完成运行吧(笑)。
③、如果是其他非个人学习用途,我也提供了一个整合文件,lapfusion.m,放在资源下载区了。另外过一段时间会上传几种不同融合策略融合的文件夹。
④、为了展示方法,代码只做了2的次幂的分辨率,所以主程序第一步就是缩放至512*512分辨率,只要对几个代码稍微修改,就可以实现任意分辨率的融合以及RGB图像的处理。
总结
传统金字塔变换的图像融合时代虽然已经结束,但是经典的方法还是有其价值,在拉普拉斯金字塔基础上,后来的金字塔变换还有CPT(对比度金字塔融合)、GPT(梯度金字塔融合)等方法,有机会的话,也将它们实现一下放在一起讨论。
多尺度图像融合的理论与技术已经发展了40年了,我想我们可以在这里继续做的,就是读懂前人的工作并且结合新的技术,比如万物皆可学习的机器学习,神经网络等,让多尺度图像融合技术继续发展。
所以,下周继续推进,进入小波变换的图像融合学习。欢迎大家一起交流学习。