压缩感知重构算法之正交匹配追踪算法

正交匹配追踪算法【Orthogonal Matching Pursuit (OMP)

0.简介

    OMP算法沿用了MP算法中的原子选择准则,即通过求余量r与感知矩阵Φ中原子之间内积的绝对值来选择最佳原子组合,不同的是OMP在分解的每一步中对所选择的全部原子进行正交化处理,这使得在精度要求相同的情况下,OMP算法的收敛速度更快。
    OMP 算法与MP算法的详细分析比较可参见博客:https://blog.csdn.net/scucj/article/details/7467955

1.算法步骤

2.程序实现

OMPMATLAB程序实现:

function Wavelet_OMP
clc;clear
%  读文件
X=imread('lena256.bmp');
X=double(X);
[a,b]=size(X);
%  小波变换矩阵生成
ww=DWT(a);
%  小波变换让图像稀疏化(注意该步骤会耗费时间,但是会增大稀疏度)
X1=ww*sparse(X)*ww';
X1=full(X1);
%  随机矩阵生成
M=190;
R=randn(M,a);
%  测量
Y=R*X1;
%  OMP算法
X2=zeros(a,b);  %  恢复矩阵
for i=1:b  %  列循环       
    rec=omp(Y(:,i),R,a);
    X2(:,i)=rec;
end
%  原始图像
figure(1);
imshow(uint8(X));
title('原始图像');
%  变换图像
figure(2);
imshow(uint8(X1));
title('小波变换后的图像');
%  压缩传感恢复的图像
figure(3);
X3=ww'*sparse(X2)*ww;  %  小波反变换
X3=full(X3);
imshow(uint8(X3));
title('恢复的图像');
%  误差(PSNR)
errorx=sum(sum(abs(X3-X).^2));        %  MSE误差
psnr=10*log10(255*255/(errorx/a/b))   %  PSNR


%  OMP的函数
%  s-测量;T-观测矩阵;N-向量大小
function hat_y=omp(s,T,N)
Size=size(T);                                     %  观测矩阵大小
M=Size(1);                                        %  测量
hat_y=zeros(1,N);                                 %  待重构的谱域(变换域)向量                     
Aug_t=[];                                         %  增量矩阵(初始值为空矩阵)
r_n=s;                                            %  残差值
for times=1:M/4;                                  %  迭代次数(稀疏度是测量的1/4)
    for col=1:N;                                  %  恢复矩阵的所有列向量
        product(col)=abs(T(:,col)'*r_n);          %  恢复矩阵的列向量和残差的投影系数(内积值) 
    end
    [val,pos]=max(product);                       %  最大投影系数对应的位置
    Aug_t=[Aug_t,T(:,pos)];                       %  矩阵扩充
    T(:,pos)=zeros(M,1);                          %  选中的列置零(实质上应该去掉,为了简单我把它置零)
    aug_y=(Aug_t'*Aug_t)^(-1)*Aug_t'*s;           %  最小二乘,使残差最小
    r_n=s-Aug_t*aug_y;                            %  残差
    pos_array(times)=pos;                         %  纪录最大投影系数的位置
    if (norm(r_n)<9)                              %  残差足够小
        break;
    end
end
hat_y(pos_array)=aug_y;                           %  重构的向量

小波变换矩阵生成函数 DWT.m

function ww=DWT(N)
[h,g]= wfilters('sym8','d');       %  分解低通和高通滤波器
% N=256;                           %  矩阵维数(大小为2的整数幂次)
L=length(h);                       %  滤波器长度
rank_max=log2(N);                  %  最大层数
rank_min=double(int8(log2(L)))+1;  %  最小层数
ww=1;   %  预处理矩阵
%  矩阵构造
for jj=rank_min:rank_max
    nn=2^jj;
    %  构造向量
    p1_0=sparse([h,zeros(1,nn-L)]);
    p2_0=sparse([g,zeros(1,nn-L)]);
    %  向量圆周移位
    for ii=1:nn/2
        p1(ii,:)=circshift(p1_0',2*(ii-1))';
        p2(ii,:)=circshift(p2_0',2*(ii-1))';
    end
    %  构造正交矩阵
    w1=[p1;p2];
    mm=2^rank_max-length(w1);
    w=sparse([w1,zeros(length(w1),mm);zeros(mm,length(w1)),eye(mm,mm)]);
    ww=ww*w;
    clear p1;clear p2;
end

3.结果展示



最终 psnr =30.9029
:稀疏基用的是小波基,观测矩阵用的高斯随机矩阵,生成小波变换矩阵的程序需要保存为DWT.m,与测试程序放在同一文件目录下。如果稀疏基采用离散余弦变换矩阵,效果不是特别好,psnr为23左右。

猜你喜欢

转载自blog.csdn.net/eleven_zou/article/details/80752771