一、核心理论与框架
自适应稀疏表示的本质是用最少的原子(基向量)线性组合表示图像信号 ,通过字典学习 捕捉图像结构特征,通过稀疏编码提取关键信息。同时实现融合与去噪的关键是:
-
多尺度分解 :将图像分解为**低频(结构)和高频(细节/噪声)**成分,分别处理;
-
自适应字典 :针对不同图像块(如平滑、边缘、纹理)学习紧凑子字典,提高稀疏表示效率;
-
联合优化:将融合规则(如最大值、加权平均)与去噪(如稀疏残差、阈值收缩)融入同一框架,避免分步处理的误差累积。
二、实现步骤与关键算法
1. 图像预处理:多尺度分解
首先对源图像进行多尺度分解 ,分离低频结构 与高频细节(噪声主要存在于高频成分)。常用分解方法包括:
-
非下采样轮廓波变换(NSCT) :具有平移不变性 和多方向选择性,适合提取图像边缘与纹理;
-
滚动引导滤波(RGF) :通过迭代高斯滤波与导向滤波,分离大尺度结构 与小尺度细节。
MATLAB代码示例(NSCT分解):
matlab
% 读取源图像(红外与可见光)
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. 自适应字典学习
针对不同图像块(如平滑、边缘、纹理)学习紧凑子字典,避免传统单一字典的冗余性。常用方法包括:
-
K-SVD算法 :通过奇异值分解(SVD)优化字典原子,适合块稀疏表示;
-
自适应组稀疏残差模型 :对相似图像块组 学习字典,通过残差优化提高去噪性能。
MATLAB代码示例(K-SVD字典学习):
matlab
% 提取训练样本(从源图像的高频细节中选取)
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算法),得到稀疏系数 ,再通过融合规则(如最大值、加权平均)合并系数,最后用字典重构融合图像。
-
稀疏编码:用**正交匹配追踪(OMP)**求解稀疏系数,保留关键特征;
-
融合规则 :对低频结构 采用加权平均 (保留整体亮度),对高频细节 采用最大值(保留边缘/纹理)。
MATLAB代码示例(稀疏编码与融合):
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代码示例(稀疏残差去噪):
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. 融合图像重构
将去噪后的高频细节与融合后的低频结构合并,得到最终融合图像:
matlab
% 合并低频与去噪后的高频细节
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. 自适应字典选择
根据图像块的梯度特征 (如梯度幅值、方向)预分类(如平滑、边缘、纹理),为每个类别学习专用子字典,提高稀疏表示效率。
matlab
% 计算图像块的梯度特征
[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代码框架,结合上述步骤:
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)**等指标评价融合结果:
-
信息熵:衡量图像信息丰富度,值越大越好;
-
SSIM:衡量结构相似性,值越接近1越好;
-
PSNR:衡量去噪效果,值越大越好。
MATLAB代码示例:
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. 优化方向
-
字典学习优化 :用卷积稀疏字典代替传统块字典,减少块效应;
-
融合规则优化:用**脉冲耦合神经网络(PCNN)**代替最大值规则,提高对细节的敏感性;
-
计算效率优化 :用在线字典学习代替批量学习,适合大规模图像。
参考代码 自适应稀疏表示的同时图像融合和去噪 www.youwenfan.com/contentcsr/112978.html
六、总结
自适应稀疏表示同时实现图像融合与去噪的核心是多尺度分解 、自适应字典 与联合优化 。通过NSCT分解 分离结构与细节,K-SVD学习 紧凑字典,OMP稀疏编码 提取关键特征,稀疏残差优化 去噪,最终实现高保真融合。