ISTA算法-图像压缩感知算法之ISTA算法

前导:
主程序:
clear all;
h=imread('cameraman.bmp');
h=im2double(h);
[m,n]=size(h);
%取图像中的64*64的图像块
B=zeros(m/4,n/4);
for i=1:m/4
    for j=1:n/4
        B(i,j)=h(m/8+i,n/8+j);
    end
end
%得到随机矩阵A
k=round(0.6*m*n/16);
A=randn(k,m*n/16);
A=sqrt(1/k)*A;
A=orth(A')';
 %主体程序
B=reshape(B,m*n/16,1);
 x=zeros(m*n/16,1);
 %迭代次数num
 num=3e3;
 lam=2e-5;
 eps=1e-4;
 
 y=A*B;
      for t=1:num
          x1=x;
          v=y-A*x;
         r=x+A'*v;
         x=eata_1(r,lam);
        
    peaksnr = psnr(x,B);
    psnrs(t) = peaksnr;
   
         if norm(x-x1)<eps
              fprintf('结束循环,num=%d\n',t); 
             break;
         end
        if j==num
        fprintf('结束循环,num=%d\n',t);
        end
      end
         B=x;
         B=reshape(B,m/4,n/4); 
figure(1);
imshow(B);
title('ISTA算法');
% psnr图
figure(2);
ax = (1:t);
plot(ax,psnrs,'-');
xlabel('迭代次数');
ylabel('psnr');

psnr(峰值信噪比)函数

    function PSNR=psnr(I,K)
    %I为转换后的图像,K为原图像
    Diff = double(I)-double(K);
    MSE = sum(Diff(:).^2)/numel(I);
    PSNR=10*log10(1^2/MSE);
    end

eata函数:
function eata=eata_1(r,lam)
%得到行和列
[a,b]=size(r);
for i=1:a
    for j=1:b
if r(i,j)>0
    sgn1=1;
else
    sgn1=-1;
end
if (abs(r(i,j))-lam)>0
     r(i,j)=sgn1*(abs(r(i,j))-lam);
 else
     r(i,j)=0;
end
    end
end
eata=r;

结果展示:
    
说明:迭代次数我设置为3000次,大家可以设置更多的迭代次数,随着迭代次数的增大,图像psnr值会趋向平稳。

猜你喜欢

转载自blog.csdn.net/jamin_liu_90/article/details/80337557