首页/文章/ 详情

一文搞懂拉普拉斯金字塔图像融合:MATLAB完整实现

4月前浏览263
本文配套程序实现的是经典的拉普拉斯金字塔图像融合。输入两张清晰区域不同的图像,程序会先进行多尺度分解,再选择更清晰的局部细节,最后重建得到一张融合图像。
图1 两张输入图与最终融合结果对比

01 为什么需要图像融合?

在图像处理中,经常会遇到这样一种情况:第一张图像某些区域清晰,另外一些区域模糊;第二张图像刚好相反。如果只保留其中一张,就会丢失另一张图像中的有效信息。

图像融合的目标,就是把多张图像中的有效信息提取出来,组合成一张细节更完整、视觉质量更好的新图像。

一句话理解:图像融合不是简单叠加,而是在不同区域、不同尺度上选择更有价值的信息。

02 程序整体流程

本程序的核心流程可以概括为五步:读取图像、构建高斯金字塔、构建拉普拉斯金字塔、设计融合规则、逐层重建融合结果。

图2 拉普拉斯金字塔图像融合流程
close all;
A = imread('first.jpg');
B = imread('second.jpg');

A = double(A);
B = double(B);
layer = 4;

其中,first.jpg 和 second.jpg 是待融合的两张输入图像;layer 表示金字塔分解层数,程序中设置为 4 层。

03 高斯金字塔:逐层变模糊、变小

高斯金字塔的作用是得到不同尺度下的平滑图像。每一层都会先进行高斯滤波,然后下采样,图像尺寸逐渐减小,细节逐渐减少。

图3 高斯金字塔分解示意图
h = [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];
h = h/256;

for i = 2:layer+1
    T_imgA = imfilter(G_A{i-1,1}, h, 'conv', 'same');
    T_imgB = imfilter(G_B{i-1,1}, h, 'conv', 'same');
    G_A{i,1} = T_imgA(2:2:end, 2:2:end);
    G_B{i,1} = T_imgB(2:2:end, 2:2:end);
end
高斯金字塔可以理解为:原图 → 轻微模糊的小图 → 更模糊、更小的图。

04 拉普拉斯金字塔:提取每一层丢失的细节

高斯金字塔保存的是不同尺度下的模糊图像,而拉普拉斯金字塔保存的是相邻尺度之间的差值,也就是边缘、纹理和细节信息。

图4 拉普拉斯金字塔细节层示意图
for i = 1:layer
    T_A1 = G_A{i,1};
    T_A2 = zeros(size(T_A1));
    T_A2(2:2:end, 2:2:end) = G_A{i+1,1};

    L_A{i,1} = 4 * imfilter(T_A2, h, 'conv', 'same');
    L_A{i,1} = T_A1 - L_A{i,1};
end

这一步的含义是:当前层图像减去下一层上采样恢复后的图像,得到当前尺度下的细节。

05 融合规则:哪里更清晰,就选哪里

图像融合最关键的问题是:当前位置到底选 A 图的系数,还是选 B 图的系数?这段程序使用了局部梯度和区域能量两种判断方式。

1)顶层融合:比较局部梯度

diff_Ax = diff([L_A{end,1} L_A{end,1}(:,end)], 1, 2);
diff_Ay = diff([L_A{end,1}; L_A{end,1}(end,:)], 1, 1);

diff_A = sqrt((diff_Ax.^2 + diff_Ay.^2) / 2);
diff_B = sqrt((diff_Bx.^2 + diff_By.^2) / 2);

ind = (A_G >= B_G);
L_C{end,1}(ind) = L_A{end,1}(ind);
L_C{end,1}(~ind) = L_B{end,1}(~ind);

2)其他层融合:比较区域能量

h_w = [1 2 1;
       2 4 2;
       1 2 1] / 16;

for i = 1:layer
    ARE_A{i,1} = imfilter(abs(L_A{i,1}), h_w, 'conv', 'same');
    ARE_B{i,1} = imfilter(abs(L_B{i,1}), h_w, 'conv', 'same');

    ind = (ARE_A{i,1} >= ARE_B{i,1});
    L_C{i,1}(ind) = L_A{i,1}(ind);
    L_C{i,1}(~ind) = L_B{i,1}(~ind);
end
融合策略的核心:不是整张图选 A 或 B,而是在每一层、每个位置上选择细节更强的那一部分。

06 重建融合图像

得到融合后的拉普拉斯金字塔 L_C 之后,程序会从最顶层开始逐层上采样,并把每一层融合后的细节加回去,最终恢复成原始尺寸的融合图像。

G_C = cell(layer+1, 1);
G_C{end,1} = L_C{end,1};

for i = layer:-1:1
    T_C1 = zeros(size(L_C{i,1}));
    T_C1(2:2:end, 2:2:end) = G_C{i+1,1};

    G_C{i,1} = 4 * imfilter(T_C1, h, 'conv', 'same');
    G_C{i,1} = L_C{i,1} + G_C{i,1};
end

figure, imshow(uint8(G_C{1,1}));
title('融合图像');
imwrite(uint8(G_C{1,1}), 'LaResult3.bmp', 'BMP');
图5 原图与融合结果再次对比

07 为什么它比简单 平均更好?

很多初学者做图像融合时,会直接使用 0.5A + 0.5B 的平均融合。虽然这种方法简单,但它不会判断哪里清晰、哪里模糊,容易导致整体图像发灰、边缘变弱、细节损失。

方法    
特点    
主要问题    
加权平均融合    
实现简单,计算量小    
容易模糊,细节损失明显    
最大值融合    
能保留强响应区域    
容易出现突变和噪声    
拉普拉斯金字塔融合    
在多尺度细节层上融合    
结构稍复杂,但效果更自然    

08 程序中最值得学习的 3 个点

知识点    
程序体现    
学习价值    
cell 存储多尺度图像    
G_A、G_B、L_A、L_B    
适合保存不同尺寸的金字塔层    
高斯滤波模板    
5×5 模板 h    
用于平滑、下采样和上采样重建    
局部能量判断清晰度    
ARE_A、ARE_B    
比单点判断更稳定,适合细节选择    

09 运行时需要注意的问题

第一,两张输入图像尺寸最好一致,否则金字塔分解和融合时容易出现维度不匹配。

第二,如果输入是彩色图像,可以先转灰度,也可以分别对 R、G、B 三个通道进行融合。

if size(A,3) == 3
    A = rgb2gray(A);
    B = rgb2gray(B);
end

第三,金字塔层数不要盲目加大。普通图像融合中,3 到 5 层通常比较合适。

10 总结

本文程序实现了一个完整的 MATLAB 拉普拉斯金字塔图像融合算法,核心思想是:先分解、再选择、最后重建。

步骤    
作用    
读取图像    
输入两张待融合图像    
高斯金字塔分解    
得到不同尺度下的平滑图像    
拉普拉斯金字塔分解    
提取不同尺度下的细节信息    
融合规则设计    
根据梯度和区域能量选择更清晰的系数    
金字塔重建    
恢复成最终融合图像    
一句话总结:拉普拉斯金字塔图像融合,就是在不同尺度上选择更清晰的细节,再把这些细节重新拼回一张图。

11源程序获取

如果你正在做 MATLAB 图像处理、图像融合、课程设计或者毕业设计,这个程序非常适合作为入门案例。


来源:MATLAB学习与应用
MATLAB多尺度
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-06-11
最近编辑:4月前
explicit-z
硕士 工种号:MATLAB学习与应用
获赞 212粉丝 79文章 328课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈