
在图像处理中,经常会遇到这样一种情况:第一张图像某些区域清晰,另外一些区域模糊;第二张图像刚好相反。如果只保留其中一张,就会丢失另一张图像中的有效信息。
图像融合的目标,就是把多张图像中的有效信息提取出来,组合成一张细节更完整、视觉质量更好的新图像。
本程序的核心流程可以概括为五步:读取图像、构建高斯金字塔、构建拉普拉斯金字塔、设计融合规则、逐层重建融合结果。

close all;
A = imread('first.jpg');
B = imread('second.jpg');
A = double(A);
B = double(B);
layer = 4;其中,first.jpg 和 second.jpg 是待融合的两张输入图像;layer 表示金字塔分解层数,程序中设置为 4 层。
高斯金字塔的作用是得到不同尺度下的平滑图像。每一层都会先进行高斯滤波,然后下采样,图像尺寸逐渐减小,细节逐渐减少。

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

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这一步的含义是:当前层图像减去下一层上采样恢复后的图像,得到当前尺度下的细节。
图像融合最关键的问题是:当前位置到底选 A 图的系数,还是选 B 图的系数?这段程序使用了局部梯度和区域能量两种判断方式。
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);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得到融合后的拉普拉斯金字塔 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');
很多初学者做图像融合时,会直接使用 0.5A + 0.5B 的平均融合。虽然这种方法简单,但它不会判断哪里清晰、哪里模糊,容易导致整体图像发灰、边缘变弱、细节损失。
第一,两张输入图像尺寸最好一致,否则金字塔分解和融合时容易出现维度不匹配。
第二,如果输入是彩色图像,可以先转灰度,也可以分别对 R、G、B 三个通道进行融合。
if size(A,3) == 3
A = rgb2gray(A);
B = rgb2gray(B);
end第三,金字塔层数不要盲目加大。普通图像融合中,3 到 5 层通常比较合适。
本文程序实现了一个完整的 MATLAB 拉普拉斯金字塔图像融合算法,核心思想是:先分解、再选择、最后重建。
如果你正在做 MATLAB 图像处理、图像融合、课程设计或者毕业设计,这个程序非常适合作为入门案例。