压缩感知与小波变换结合的MATLAB实现

压缩感知与小波变换结合的MATLAB实现


一、核心流程

压缩感知(CS)与小波变换结合的核心思想是:利用小波域的稀疏性,通过少量测量值恢复图像。具体步骤如下:

  1. 小波分解:将图像分解为多尺度子带,保留低频(LL)子带作为稀疏信号。
  2. 压缩感知采样:对低频子带应用测量矩阵(如高斯随机矩阵)生成压缩观测值。
  3. 正交匹配追踪(OMP)重构:从观测值中恢复稀疏的小波系数。
  4. 逆小波变换:将重构的小波系数恢复为原始图像。

二、MATLAB实现代码

基于小波变换和OMP算法的压缩感知图像恢复代码:

function recovered_img = CS_Wavelet_Reconstruction(y, Phi, K, wavelet, level)
    % 输入参数:
    % y: 观测向量 (M×1)
    % Phi: 测量矩阵 (M×N)
    % K: 稀疏度 (小波系数非零元素数)
    % wavelet: 小波基 ('db4', 'sym4'等)
    % level: 小波分解层数
    % 输出:恢复图像

    % 小波分解结构初始化
    [c, s] = wavedec2(ones(size(y,1)), level, wavelet); % 假设原始图像为方阵
    
    % 小波域压缩感知恢复
    X = zeros(size(c));
    residual = y;
    idx_set = [];
    
    for iter = 1:K
        % 找到与残差最相关的列
        proj = Phi' * residual;
        [~, max_idx] = max(abs(proj));
        idx_set = [idx_set, max_idx];
        
        % 最小二乘求解
        A = Phi(:, idx_set);
        x_temp = pinv(A) * y;
        
        % 更新残差
        residual = y - A * x_temp;
        
        % 更新稀疏系数
        X(idx_set) = x_temp;
    end
    
    % 逆小波变换
    recovered_img = waverec2(X, s, wavelet);
end

% 示例调用
N = 256; % 图像尺寸
M = round(N^2 * 0.25); % 采样率25%
wavelet = 'sym4'; % 小波基
level = 2; % 分解层数

% 生成测试图像(Lena)
img = imread('lena256.bmp');
img = im2double(rgb2gray(img));

% 小波分解
[c, s] = wavedec2(img, level, wavelet);

% 提取低频子带(LL)
low_freq = appcoef2(c, s, wavelet, level);

% 生成测量矩阵(高斯随机矩阵)
Phi = randn(M, size(low_freq,1)) / sqrt(M);

% 生成观测值
y = Phi * low_freq(:);

% 压缩感知恢复
recovered_img = CS_Wavelet_Reconstruction(y, Phi, 10, wavelet, level);

% 显示结果
figure;
subplot(1,2,1); imshow(img); title('原始图像');
subplot(1,2,2); imshow(recovered_img); title('恢复图像 (PSNR=%.2f dB)' , psnr(recovered_img,img));

三、关键参数与优化

  1. 小波基选择

    • 推荐sym4(对称性好,边缘保护强)或 db4(计算效率高)。

    • 对比实验

      wavelets = {'db4', 'sym4', 'coif4'};
      for i = 1:length(wavelets)
          [c, s] = wavedec2(img, 2, wavelets{i});
          sparsity = sum(abs(appcoef2(c, s, wavelets{i}, 2)) < 0.1);
          fprintf('%s 稀疏率: %.2f%%
      ', wavelets{i}, sparsity/numel(img)*100);
      end
      
  2. 测量矩阵设计

    • 高斯矩阵:理论最优,但内存消耗大(需分块处理)。

    • 分块优化

      block_size = 16; % 分块尺寸
      num_blocks = ceil(size(low_freq,1)/block_size);
      Phi = cell(num_blocks,1);
      for i = 1:num_blocks
          Phi{i} = randn(block_size, block_size) / sqrt(block_size);
      end
      
  3. OMP参数调优

    • 稀疏度K:通常取图像非零系数的1.2~1.5倍。
    • 迭代停止条件:残差能量低于阈值或达到最大迭代次数。

参考代码 压缩感知用于小波变换后的图像 www.youwenfan.com/contentcnr/100429.html

四、性能评估

  1. 定量指标

    % 计算PSNR和SSIM
    psnr_value = psnr(recovered_img, img);
    ssim_value = ssim(recovered_img, img);
    fprintf('PSNR: %.2f dB, SSIM: %.4f\n', psnr_value, ssim_value);
    
  2. 可视化分析

    • 小波系数对比

      figure;
      subplot(1,2,1); imagesc(log(abs(c))); colormap(jet); title('原始小波系数');
      subplot(1,2,2); imagesc(log(abs(X))); colormap(jet); title('恢复小波系数');
      

五、应用场景

  1. 医学图像压缩:减少MRI/CT扫描数据量,加速成像。
  2. 卫星图像传输:低带宽环境下传输关键区域。
  3. 安防监控:实时压缩感知视频流处理。

六、改进方向

  1. 多级小波分解:结合多尺度特征提升稀疏性。
  2. 混合测量矩阵:高斯矩阵+二值矩阵,平衡性能与存储。
  3. 深度学习辅助:用CNN估计小波系数稀疏度。

七、总结

通过小波变换与压缩感知的结合,可在保证图像质量的前提下显著降低数据量。核心在于小波域的稀疏性建模OMP算法的高效重构。实际应用中需根据图像特性选择小波基和测量矩阵,并通过参数调优平衡效率与精度。

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