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值会趋向平稳。
  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值