基于导向滤波的图像融合

基于导向滤波的图像融合是一种先进方法,它利用导向滤波优异的边缘保持特性,在融合多幅图像(如多焦点、多曝光图像)时,能显著提升结果图像的清晰度和自然度,有效避免传统方法在边缘处易出现的伪影或光晕。

典型流程图:

flowchart LR
    subgraph A[输入]
        direction LR
        A1[图像A] & A2[图像B]
    end

    A --> B

    subgraph B[核心融合流程]
        B1[多尺度分解<br>(如拉普拉斯金字塔)] --> B2[基于导向滤波的<br>融合规则(关键)] --> B3[重建与后处理]
    end

    B --> C[输出融合图像]

核心原理:为什么用导向滤波?

在图像融合中,我们需要从源图像中提取最清晰、信息最丰富的部分。简单的加权平均或基于像素的选取会在物体边缘处产生不自然的过渡。导向滤波的核心优势在于:

实现步骤与MATLAB关键代码

一个典型的基于导向滤波的多尺度融合方案包含以下步骤。以下代码框架以融合两幅多焦点图像为例:

1. 图像预处理与对齐

% 假设已读取两幅待融合图像 I1, I2
% 确保图像尺寸相同,并进行必要的配准(如果存在偏移)
if size(I1, 3) == 3
    I1_gray = rgb2gray(I1);
    I2_gray = rgb2gray(I2);
else
    I1_gray = I1; I2_gray = I2;
end
% 此处应加入图像配准代码(如使用imregister)如果图像未对齐

2. 多尺度分解(以拉普拉斯金字塔为例)
图像融合通常在多尺度(金字塔)上进行,以分离不同频带的信息。

% 构建高斯金字塔和拉普拉斯金字塔
num_levels = 5; % 金字塔层数
[G1, L1] = buildLaplacianPyramid(I1, num_levels);
[G2, L2] = buildLaplacianPyramid(I2, num_levels);
% 注:buildLaplacianPyramid需要自定义或使用MATLAB图像处理函数组合实现

3. 基于导向滤波的融合规则(关键步骤)
这是算法的核心。我们为每层金字塔的每个像素计算一个融合权重。这里,我们使用图像的清晰度(如梯度幅值)作为初始权重,然后用导向滤波对其进行优化,使其在空间上连续且边缘对齐。

% 为每幅图像计算清晰度图(以梯度幅值为例)
S1 = abs(imgradient(I1_gray, 'sobel'));
S2 = abs(imgradient(I2_gray, 'sobel'));

% 构建初始权重图 (简单示例: 谁更清晰,权重更大)
W1_init = double(S1 > S2); % 二值化初始权重
W2_init = 1 - W1_init;

% 使用导向滤波优化权重图
% 关键函数:guidedfilter (需要自行实现或从社区获取,见下文资源)
radius = 5; % 滤波半径
eps = 0.01; % 正则化参数,控制平滑程度
% 使用原图I1_gray作为引导图来优化W1,使权重图的边缘与原图边缘对齐
W1 = guidedfilter(I1_gray, W1_init, radius, eps);
W2 = guidedfilter(I2_gray, W2_init, radius, eps);
% 归一化权重,确保和为1
W_sum = W1 + W2 + eps;
W1 = W1 ./ W_sum;
W2 = W2 ./ W_sum;

% 将优化后的权重也应用到各金字塔层(可对权重下采样匹配各层尺寸)
% 假设已获得各层对应的权重 W1_pyr{k}, W2_pyr{k}

4. 加权融合与金字塔重建

% 对各拉普拉斯金字塔层进行加权融合
L_fused = cell(1, num_levels);
for k = 1:num_levels
    % 获取与当前金字塔层尺寸匹配的权重
    W1_resized = imresize(W1, size(L1{k}), 'bilinear');
    W2_resized = imresize(W2, size(L2{k}), 'bilinear');
    % 加权融合
    L_fused{k} = W1_resized .* L1{k} + W2_resized .* L2{k};
end

% 从融合后的拉普拉斯金字塔重建图像
I_fused = reconstructFromLaplacianPyramid(L_fused);

5. 后处理与结果评估

% 确保像素值在合理范围内
I_fused = im2double(I_fused); % 或使用 mat2gray 归一化
I_fused = min(max(I_fused, 0), 1);

% 显示结果
figure; 
subplot(1,3,1); imshow(I1); title('源图像1');
subplot(1,3,2); imshow(I2); title('源图像2');
subplot(1,3,3); imshow(I_fused); title('导向滤波融合结果');

% 可计算客观评价指标,如信息熵、边缘保持度等

参考代码 基于导向滤波的图像融合 www.youwenfan.com/contentcsn/95871.html

关键点与注意事项

 

专注于matlab/simulink,电子电路,编程