[学习笔记-图像处理篇]基于拉普拉斯金字塔的图像融合matlab程序梳理

特别鸣谢程序来源:
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


  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值