matlab实现自适应稀疏表示同时完成图像融合与去噪

matlab实现自适应稀疏表示同时完成图像融合与去噪

一、核心理论与框架

自适应稀疏表示的本质是用最少的原子(基向量)线性组合表示图像信号,通过字典学习捕捉图像结构特征,通过稀疏编码提取关键信息。同时实现融合与去噪的关键是:

  1. 多尺度分解:将图像分解为低频(结构)高频(细节/噪声)成分,分别处理;
  2. 自适应字典:针对不同图像块(如平滑、边缘、纹理)学习紧凑子字典,提高稀疏表示效率;
  3. 联合优化:将融合规则(如最大值、加权平均)与去噪(如稀疏残差、阈值收缩)融入同一框架,避免分步处理的误差累积。

二、实现步骤与关键算法

1. 图像预处理:多尺度分解

首先对源图像进行多尺度分解,分离低频结构高频细节(噪声主要存在于高频成分)。常用分解方法包括:

MATLAB代码示例(NSCT分解)

% 读取源图像(红外与可见光)
ir = imread('IR.png'); vis = imread('VIS.png');
ir_gray = rgb2gray(ir); vis_gray = rgb2gray(vis);

% NSCT分解(使用MATLAB的NSCT工具箱)
[ir_base, ir_detail] = nsct_decomp(ir_gray, 4, [2,3,4,5]); % 4层分解,方向数[2,3,4,5]
[vis_base, vis_detail] = nsct_decomp(vis_gray, 4, [2,3,4,5]);

2. 自适应字典学习

针对不同图像块(如平滑、边缘、纹理)学习紧凑子字典,避免传统单一字典的冗余性。常用方法包括:

MATLAB代码示例(K-SVD字典学习)

% 提取训练样本(从源图像的高频细节中选取)
train_samples = [ir_detail(:); vis_detail(:)]; % 合并红外与可见光的高频成分
patch_size = 8; % 图像块大小
dict_size = 256; % 字典原子数

% 使用K-SVD学习字典(调用SPAMS工具箱的ksvd函数)
D = ksvd(train_samples, patch_size, dict_size, 'Tolerance', 1e-6);

3. 稀疏编码与融合

对每个图像块进行稀疏编码(用OMP算法),得到稀疏系数,再通过融合规则(如最大值、加权平均)合并系数,最后用字典重构融合图像。

MATLAB代码示例(稀疏编码与融合)

% 对红外与可见光的高频细节进行稀疏编码
ir_alpha = omp(ir_detail, D, 10); % OMP算法,最多10次迭代
vis_alpha = omp(vis_detail, D, 10);

% 融合规则:高频细节取最大值,低频结构取平均
fused_detail_alpha = max(abs(ir_alpha), abs(vis_alpha)) .* sign(ir_alpha + vis_alpha);
fused_base = (ir_base + vis_base) / 2; % 低频结构平均融合

% 重构融合图像(高频+低频)
fused_detail = reconstruct(fused_detail_alpha, D); % 用字典重构高频细节
fused_image = fused_base + fused_detail; % 合并低频与高频

4. 去噪处理:稀疏残差优化

对融合后的高频细节进行去噪,常用稀疏残差模型:通过最小化残差(原始信号与稀疏表示的误差)抑制噪声。

MATLAB代码示例(稀疏残差去噪)

% 初始化去噪图像(融合后的高频细节)
denoised_detail = fused_detail;
iter_num = 5; % 迭代次数

for iter = 1:iter_num
    % 分块并匹配相似块
    [blocks, ~] = im2col(denoised_detail, [8,8], 'distinct'); % 8x8块
    similar_blocks = match_similar_blocks(blocks, 10); % 每个块匹配10个相似块
    
    % 对每个相似块组进行稀疏残差优化
    for i = 1:size(similar_blocks, 2)
        block_group = similar_blocks(:,i);
        [D_group, alpha_group] = learn_group_dict(block_group, 128); % 学习组字典
        residual = block_group - D_group * alpha_group; % 计算残差
        denoised_block = D_group * alpha_group + soft_threshold(residual, 0.1); % 软阈值收缩
        denoised_detail(blocks == block_group) = denoised_block; % 更新去噪图像
    end
end

5. 融合图像重构

将去噪后的高频细节与融合后的低频结构合并,得到最终融合图像

% 合并低频与去噪后的高频细节
final_fused_image = fused_base + denoised_detail;

% 后处理(如归一化、对比度增强)
final_fused_image = mat2gray(final_fused_image); % 归一化到[0,1]
final_fused_image = imadjust(final_fused_image, stretchlim(final_fused_image), []); % 对比度增强

三、优化

1. 自适应字典选择

根据图像块的梯度特征(如梯度幅值、方向)预分类(如平滑、边缘、纹理),为每个类别学习专用子字典,提高稀疏表示效率。

% 计算图像块的梯度特征
[gx, gy] = gradient(ir_gray);
grad_mag = sqrt(gx.^2 + gy.^2); % 梯度幅值
grad_dir = atan2(gy, gx); % 梯度方向

% 预分类图像块(如梯度幅值>阈值则为边缘块)
edge_blocks = find(grad_mag > 0.5);
smooth_blocks = find(grad_mag <= 0.5);

% 为边缘块与平滑块学习不同字典
D_edge = ksvd(edge_blocks, 8, 128);
D_smooth = ksvd(smooth_blocks, 8, 128);

2. 联合融合与去噪

将融合规则与去噪融入同一优化框架,避免分步处理的误差累积。例如,三层次分解与稀疏表示(TLD-SR)方法:

3. 迭代优化

通过迭代更新(如字典学习、稀疏系数、去噪图像),逐步提高融合与去噪性能。例如,自适应组稀疏残差模型通过5-10次迭代,有效抑制噪声并保留细节。

四、MATLAB代码总结

以下是同时实现图像融合与去噪的完整MATLAB代码框架,结合上述步骤:

% 1. 读取源图像
ir = imread('IR.png'); vis = imread('VIS.png');
ir_gray = rgb2gray(ir); vis_gray = rgb2gray(vis);

% 2. 多尺度分解(NSCT)
[ir_base, ir_detail] = nsct_decomp(ir_gray, 4, [2,3,4,5]);
[vis_base, vis_detail] = nsct_decomp(vis_gray, 4, [2,3,4,5]);

% 3. 自适应字典学习(K-SVD)
train_samples = [ir_detail(:); vis_detail(:)];
patch_size = 8; dict_size = 256;
D = ksvd(train_samples, patch_size, dict_size, 'Tolerance', 1e-6);

% 4. 稀疏编码与融合
ir_alpha = omp(ir_detail, D, 10);
vis_alpha = omp(vis_detail, D, 10);
fused_detail_alpha = max(abs(ir_alpha), abs(vis_alpha)) .* sign(ir_alpha + vis_alpha);
fused_base = (ir_base + vis_base) / 2;

% 5. 去噪处理(稀疏残差优化)
denoised_detail = fused_detail;
for iter = 1:5
    [blocks, ~] = im2col(denoised_detail, [8,8], 'distinct');
    similar_blocks = match_similar_blocks(blocks, 10);
    for i = 1:size(similar_blocks, 2)
        block_group = similar_blocks(:,i);
        [D_group, alpha_group] = learn_group_dict(block_group, 128);
        residual = block_group - D_group * alpha_group;
        denoised_block = D_group * alpha_group + soft_threshold(residual, 0.1);
        denoised_detail(blocks == block_group) = denoised_block;
    end
end

% 6. 重构融合图像
fused_detail = reconstruct(fused_detail_alpha, D);
final_fused_image = fused_base + denoised_detail;
final_fused_image = mat2gray(final_fused_image);
final_fused_image = imadjust(final_fused_image, stretchlim(final_fused_image), []);

% 7. 结果显示
figure;
subplot(131); imshow(ir_gray); title('红外图像');
subplot(132); imshow(vis_gray); title('可见光图像');
subplot(133); imshow(final_fused_image); title('融合结果');

五、结果分析与优化

1. 客观评价

信息熵(Entropy)结构相似性(SSIM)峰值信噪比(PSNR)等指标评价融合结果:

MATLAB代码示例

% 计算客观指标
entropy_ir = entropy(ir_gray);
entropy_vis = entropy(vis_gray);
entropy_fused = entropy(final_fused_image);
ssim_ir_vis = ssim(ir_gray, vis_gray);
ssim_fused = ssim(final_fused_image, ir_gray);
psnr_fused = psnr(final_fused_image, ir_gray);

% 显示结果
fprintf('红外图像信息熵: %.2f\n', entropy_ir);
fprintf('可见光图像信息熵: %.2f\n', entropy_vis);
fprintf('融合图像信息熵: %.2f\n', entropy_fused);
fprintf('红外与可见光SSIM: %.2f\n', ssim_ir_vis);
fprintf('融合图像与红外SSIM: %.2f\n', ssim_fused);
fprintf('融合图像PSNR: %.2f dB\n', psnr_fused);

2. 优化方向

参考代码 自适应稀疏表示的同时图像融合和去噪 www.youwenfan.com/contentcsr/112978.html

六、总结

自适应稀疏表示同时实现图像融合与去噪的核心是多尺度分解自适应字典联合优化。通过NSCT分解分离结构与细节,K-SVD学习紧凑字典,OMP稀疏编码提取关键特征,稀疏残差优化去噪,最终实现高保真融合

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