浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

主要内容:

1、IHT的算法流程

2、IHT的MATLAB实现

3、二维信号的实验与结果

4、加速的IHT算法实验与结果

一、IHT的算法流程

文献:T. Blumensath and M. Davies, "Iterative Hard Thresholding for Compressed Sensing," 2008.

基本思想:给定一个初始的X0,然后通过以下的阈值公式不断地迭代。

二、IHT的MATLAB实现

复制代码
function hat_x=cs_iht(y,T_Mat,s_ratio,m)
% y=T_Mat*x, T_Mat is n-by-m
% y - measurements
% T_Mat - combination of random matrix and sparse representation basis
% s_ratio - sparsity percentage of original signal
% m - size of the original signal
% the sparsity is length(y)/4

hat_x_tp=zeros(m,1);         % initialization with the size of original 
s=floor(length(y)*s_ratio);        % sparsity
u=0.5;                       % impact factor

% T_Mat=T_Mat/sqrt(sum(sum(T_Mat.^2))); % normalizae the whole matrix

for times=1:s
    
    x_increase=T_Mat'*(y-T_Mat*hat_x_tp);
    
    hat_x=hat_x_tp+u*x_increase;
    
    [val,pos]=sort(abs(hat_x),'descend');  
    
    hat_x(pos(s+1:end))=0;   % thresholding, keeping the larges s elements

    hat_x_tp=hat_x;          % update

end
复制代码

三、二维信号的实验与结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
function Demo_CS_IHT()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% the DCT basis  is  selected  as  the sparse representation dictionary
% instead of seting the whole image  as  a vector, I process the image  in  the
% fashion of column- by -column, so  as  to reduce the complexity.
 
% Author: Chengfu Huo, roy@mail.ustc.edu.cn, http: //home.ustc.edu.cn/~roy
% Reference: T. Blumensath and M. Davies, “Iterative Hard Thresholding  for
% Compressed Sensing,” 2008.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%------------ read  in  the image --------------
img=imread( 'lena.bmp' );     % testing image
img= double (img);
[height,width]=size(img);
 
 
%------------ form the measurement matrix and  base  matrix ---------------
Phi=randn(floor(height/3),width);  % only keep one third of the original data 
Phi = Phi./repmat(sqrt(sum(Phi.^2,1)),[floor(height/3),1]); % normalize each column
 
mat_dct_1d=zeros(256,256);  % building the DCT basis (corresponding to each column)
for  k=0:1:255
     dct_1d=cos([0:1:255]'*k*pi/256);
     if  k>0
         dct_1d=dct_1d-mean(dct_1d);
     end;
     mat_dct_1d(:,k+1)=dct_1d/norm(dct_1d);
end
 
 
%--------- projection ---------
img_cs_1d=Phi*img;          % treat each column  as  a independent signal
 
 
%-------- recover  using  iht ------------
sparse_rec_1d=zeros(height,width);           
Theta_1d=Phi*mat_dct_1d;
s_ratio = 0.2;
for  i=1:width
     column_rec=cs_iht(img_cs_1d(:,i),Theta_1d,s_ratio,height);
     sparse_rec_1d(:,i)=column_rec';           % sparse representation
end
img_rec_1d=mat_dct_1d*sparse_rec_1d;          % inverse transform
 
 
%------------ show the results --------------------
figure(1)
% subplot(2,2,1),imagesc(img),title( 'original image' )
subplot(2,2,1),imshow(img,[]),title( 'original image' )
subplot(2,2,2),imagesc(Phi),title( 'measurement mat' )
subplot(2,2,3),imagesc(mat_dct_1d),title( '1d dct mat' )
psnr = 20*log10(255/sqrt(mean((img(:)-img_rec_1d(:)).^2)));
% subplot(2,2,4),imagesc(img_rec_1d),title(strcat( '1d rec img ' ,num2str(psnr), 'dB' ))
subplot(2,2,4),imshow(img_rec_1d,[]),title(strcat( '1d rec img ' ,num2str(psnr), 'dB' ))
 
disp( 'over' )
 
 
%************************************************************************%
function hat_x=cs_iht(y,T_Mat,s_ratio,m)
% y=T_Mat*x, T_Mat  is  n- by -m
% y - measurements
% T_Mat - combination of random matrix and sparse representation basis
% s_ratio - sparsity percentage of original signal
% m - size of the original signal
% the sparsity  is  length(y)/4
 
hat_x_tp=zeros(m,1);         % initialization with the size of original
s=floor(length(y)*s_ratio);        % sparsity
u=0.5;                       % impact factor
 
% T_Mat=T_Mat/sqrt(sum(sum(T_Mat.^2))); % normalizae the whole matrix
 
for  times=1:s
     
     x_increase=T_Mat'*(y-T_Mat*hat_x_tp);
     
     hat_x=hat_x_tp+u*x_increase;
     
     [val,pos]=sort(abs(hat_x), 'descend' ); 
     
     hat_x(pos(s+1:end))=0;   % thresholding, keeping the larges s elements
 
     hat_x_tp=hat_x;          % update
 
end

结论:实验针对的是图像信号,但算法中运用的是1维的算法,因此实验结果不太理想。(后面提供一个链接,有更好的代码 hard_l0_Mterm.m)

四、加速的IHT算法实验与结果

文献:Blumensath T. Accelerated iterative hard thresholding[J]. Signal Processing, 2012, 92(3): 752-756.

五、相关代码

http://www.personal.soton.ac.uk/tb1m08/sparsify/sparsify.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值