%jpeg2k2im源程序
function x=jpeg2k2im(y)
%解码一个im2jpeg压缩图像
%x=jpeg2k2im(y)解码压缩图像y,重构初始图像x的一个近似值。
%y是通过im2jpeg2k返回编码结构
%也看im2jpeg2k
error(nargchk(1,1,nargin));%检查输入参数
%得到解码参数:尺度、量化向量、步长表大小、零运行编码、数据结束编码、小波簿记数组和步长表
n=double(y.n);
q=double(y.q)/100;
runs=double(y.runs);
rlen=length(runs);
zrc=-double(y.zrc);
eoc=zrc-1;
s=double(y.s);
s=reshape(s,n+2,2);
%计算小波变换大小
c1=prod(s(1,:));
for i=2:n+1
c1=c1+3*prod(s(i,:));
end
%通过零运行编码执行霍夫曼编码
r=huff2mat(y.huffman);
c=[];zi=find(r==zrc);i=1;
for j=1:length(zi)
c=[c r(i:zi(j)-1) zeros(1,runs(r(zi(j)+1)))];
i=zi(j)+2;
end
zi=find(r==eoc);%撤消终止零运行或最后非零运行
if length(zi)==1
c=[c r(i:zi-1)];
c=[c zeros(1,c1-length(c))];
else
c=[c r(i:end)];
end
%非标准化系数
c=c+(c>0)-(c<0);
for k=1:n
qi=3*k-2;
c=wavepaste('h',c,s,k,wavecopy('h',c,s,k)*q(qi));
c=wavepaste('v',c,s,k,wavecopy('v',c,s,k)*q(qi+1));
c=wavepaste('d',c,s,k,wavecopy('d',c,s,k)*q(qi+2));
end
c=wavepaste('a',c,s,k,wavecopy('a',c,s,k)*q(qi+3));
%计算逆小波变换和水平平移
x=waveback(c,s,'jpeg9.7',n);
x=uint8(x+128);
jpeg2k2im.m
最新推荐文章于 2021-07-28 13:52:00 发布