正交匹配追踪算法【Orthogonal Matching Pursuit (OMP)】
0.简介
OMP算法沿用了MP算法中的原子选择准则,即通过求余量r与感知矩阵Φ中原子之间内积的绝对值来选择最佳原子组合,不同的是OMP在分解的每一步中对所选择的全部原子进行正交化处理,这使得在精度要求相同的情况下,OMP算法的收敛速度更快。
1.算法步骤
2.程序实现
OMP的MATLAB程序实现:
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左右。