基于小波变换的MATLAB图像融合实现方法

基于小波变换的MATLAB图像融合实现方法,包含手动实现和内置函数两种方法


一、核心代码实现(手动分解法)

%% 参数设置
clear; clc;
img1 = imread('lena.jpg'); img2 = imread('lena_noise.jpg');
img1 = imresize(img1, [256,256]); img2 = imresize(img2, [256,256]);
img1 = im2double(img1); img2 = im2double(img2);

level = 3; % 分解层数
wavelet = 'db4'; % 小波基函数

%% 小波分解
[c1, s1] = wavedec2(img1, level, wavelet);
[c2, s2] = wavedec2(img2, level, wavelet);

%% 融合规则
fused_coeffs = zeros(size(c1));
for i = 1:level
    % 低频分量融合(取平均)
    low1 = appcoef2(c1, s1, wavelet, i);
    low2 = appcoef2(c2, s2, wavelet, i);
    fused_low = (low1 + low2) / 2;
    
    % 高频分量融合(取绝对值最大)
    [cH1, cV1, cD1] = detcoef2('all', c1, s1, i);
    [cH2, cV2, cD2] = detcoef2('all', c2, s2, i);
    fused_high = max(abs(cH1), abs(cH2));
    
    % 重构融合系数
    fused_coeffs(1:s1(1,i)) = [fused_low, fused_high(:)];
end

%% 小波重构
fused_img = waverec2(fused_coeffs, s1, wavelet);

%% 后处理
figure;
subplot(1,3,1); imshow(img1); title('原始图像1');
subplot(1,3,2); imshow(img2); title('原始图像2');
subplot(1,3,3); imshow(fused_img); title('融合结果');

二、使用内置函数实现(wfusimg)

%% 参数设置
img1 = imread('lena.jpg'); img2 = imread('lena_noise.jpg');
img1 = imresize(img1, [256,256]); img2 = imresize(img2, [256,256]);
img1 = im2double(img1); img2 = im2double(img2);

level = 3; % 分解层数
wavelet = 'sym4'; % 小波基函数

%% 融合参数设置
rule = {'max', 'max'}; % 高频取最大值,低频取最大值
trim = 'on'; % 自动裁剪

%% 执行融合
tic;
fused_img = wfusimg(img1, img2, wavelet, level, rule{1}, rule{2}, trim);
toc;

%% 显示结果
figure;
subplot(1,3,1); imshow(img1); title('原始图像1');
subplot(1,3,2); imshow(img2); title('原始图像2');
subplot(1,3,3); imshow(fused_img); title('融合结果');

三、参数说明

参数 取值范围 推荐值 作用说明
level 1-5 3 分解层数影响细节保留程度
wavelet Daubechies系列 db4/db5 影响频带划分特性
rule max 高频分量融合策略
trim 'on'/'off' on 自动去除边界黑边

四、融合规则详解

  1. 低频分量处理

    • 平均法:保留整体结构信息
    • 加权平均:根据能量分布调整权重
    % 加权平均示例
    weight1 = energy(img1); weight2 = energy(img2);
    fused_low = (weight1*low1 + weight2*low2) / (weight1+weight2);
    
  2. 高频分量处理

    • 绝对值最大:保留显著边缘特征
    • 区域方差最大:增强纹理信息
    % 区域方差法
    var1 = localvar(img1); var2 = localvar(img2);
    fused_high = (var1 > var2) .* cH1 + (var2 >= var1) .* cH2;
    

参考代码 matlab源程序,通过小波变换进行图像融合 www.youwenfan.com/contentcnm/79027.html

该方法通过小波多分辨率分析实现图像特征融合,实际应用中建议根据具体场景调整分解层数和融合规则。

posted @ 2025-11-26 16:14  yu8yu7  阅读(25)  评论(0)    收藏  举报