【MATLAB图像融合】[8] 基于拉普拉斯金字塔的融合(LPT)

一、高斯-拉普拉斯金字塔

简介
       第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        2、对于非顶层的其余层融合,采用区域能量算法。

主功能函数

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);                     %分别测试45层融合情况。
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金字塔融合图像');

运行结果:
【MATLAB图像融合】[8] 基于拉普拉斯金字塔的融合(LPT)_第1张图片
       由论文:申晓华,杨国胜,张焕龙.改进的基于区域能量的图像融合方法【J】导弹与制导学报2006,26(4):279-281 所提出的方法,用拉普拉斯金字塔分解代替,得到实验结果:
【MATLAB图像融合】[8] 基于拉普拉斯金字塔的融合(LPT)_第2张图片

注:
①、还有一个函数是能量算法的函数,在我上一节的代码中附有。本文所有代码加上能量算法代码即可完整运行。
②、将代码拆分是为了讲解和分别调用,如果已经看到这里了,想必分散的文件也可以完成运行吧(笑)。
③、如果是其他非个人学习用途,我也提供了一个整合文件,lapfusion.m,放在资源下载区了。另外过一段时间会上传几种不同融合策略融合的文件夹。
④、为了展示方法,代码只做了2的次幂的分辨率,所以主程序第一步就是缩放至512*512分辨率,只要对几个代码稍微修改,就可以实现任意分辨率的融合以及RGB图像的处理。

总结
       传统金字塔变换的图像融合时代虽然已经结束,但是经典的方法还是有其价值,在拉普拉斯金字塔基础上,后来的金字塔变换还有CPT(对比度金字塔融合)、GPT(梯度金字塔融合)等方法,有机会的话,也将它们实现一下放在一起讨论。
       多尺度图像融合的理论与技术已经发展了40年了,我想我们可以在这里继续做的,就是读懂前人的工作并且结合新的技术,比如万物皆可学习的机器学习,神经网络等,让多尺度图像融合技术继续发展。
       所以,下周继续推进,进入小波变换的图像融合学习。欢迎大家一起交流学习。

你可能感兴趣的:(图像融合,MATLAB,matlab,计算机视觉)