ISTA算法-图像压缩感知算法之ISTA算法
前导:
主程序:
clear all;
h=imread('cameraman.bmp');
h=im2double(h);
[m,n]=size(h);
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
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')';
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算法');
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');
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
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);
%得到行和列
[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;
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值会趋向平稳。