[计算机视觉] 使用高斯金字塔 拉普拉斯金字塔 进行图像融合 Matlab源码

main.m

clear;
clc;
apple = double(imread('apple.jpg'));
orange = double(imread('orange.jpg'));
mask = double(zeros(512, 512, 3));
mask(:, 1:256, :) = 255;


layer = 6;
result_pyramid = cell(1, layer);

% 构造高斯金字塔
gaussian_apple = get_gaussian_pyramid(apple, layer);
gaussian_orange = get_gaussian_pyramid(orange, layer);
gaussian_mask = get_gaussian_pyramid(mask, layer);

% 构造拉普拉斯金字塔
laplace_apple = get_laplace_pyramid(gaussian_apple, layer);
laplace_orange = get_laplace_pyramid(gaussian_orange, layer);

% RES = A .* B + O .* (1 - B)
for i=1:layer
    result_pyramid{i} = laplace_apple{i} .* (gaussian_mask{i} / 255) + laplace_orange{i} .* (1 - (gaussian_mask{i} / 255));
end

% 重新构造图像 每次都是对上次的结果进行上采样,而不是最初的结果, 与前面从高斯构造拉普拉斯不同
w = (1/16) * [1, 4, 6, 4, 1];
for i=layer-1:-1:1
    resize_iamge = imresize(result_pyramid{i+1},2,'bilinear');
    first_filter = imfilter(resize_iamge, w, 'replicate');
    second_filter = imfilter(first_filter, w', 'replicate');
    result_pyramid{i} = result_pyramid{i} + second_filter;
end

% 显示图像
figure(1);
for i=1:layer
    subplot(2,3,i);
    imshow(uint8(result_pyramid{i}));
end

get_laplace_pyramid.m

function laplace_pyramid = get_laplace_pyramid(gaussian_pyramid, layer)
    w = (1/16) * [1, 4, 6, 4, 1];
    laplace_pyramid = cell(1, layer);
    laplace_pyramid{layer} = gaussian_pyramid{layer};
    
    for i=layer-1:-1:1
        resize_image = imresize(gaussian_pyramid{i+1}, 2, 'bilinear');
        first_filter = imfilter(resize_image, w, 'replicate');
        second_filter = imfilter(first_filter, w', 'replicate');
        laplace_pyramid{i} = gaussian_pyramid{i} - second_filter;
    end
end

get_gaussian_pyramid.m

function gaussian_pyramid = get_gaussian_pyramid(image, layer)
    w = (1/16) * [1, 4, 6, 4, 1];
    gaussian_pyramid = cell(1, layer);
    gaussian_pyramid{1} = image;
    for i=2:layer
        first_filter = imfilter(gaussian_pyramid{i-1}, w, 'replicate');
        second_filter = imfilter(first_filter, w', 'replicate');
        gaussian_pyramid{i} = second_filter(1:2:end, 1:2:end, :);
    end
end

实验图像

在这里插入图片描述
在这里插入图片描述

效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40996518/article/details/106957625