%im2jpeg2k源程序
function y=im2jpeg2k(x,n,q)
%im2jpeg2k使用JPEG2000近似值压缩图像
%y=im2jpeg2k(x,n,q)使用N尺度jpeg2k小波变换,不明确和明确系数量化和零步长解码去压缩图像
%如果量化向量仅包含两个元素,它们被认为不明确量化参数。
%否则被认为包含明确子带步长。
%y是包含霍夫曼编码数据和加上为编码通过JPEG2K2IM得到的参数的一个编码结构。
global RUNS
error(nargchk(3,3,nargin));%检查输入参数
if nidms(x) ~=2 | ~isreal(x) | ~isnumeric(x) | ~isa(x,'uint8')
error('The input must be a UINT8 image.');
end
if length(q) ~=2 & length(q) ~=3*n+1
error('The quantization step size vector is bad.');
end
%水平平移输入和计算它的小波变量
x=double(x)-128;
[c,s]=wavefast(x,n,'jpeg9.7');
%量化小波系数
q=stepsize(n,q);
sgn=sign(c);sgn(find(sgn==0))=1;c=abs(c);
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));
c=floor(c);c=c.*sgn;
%通过创造一个特别的编码为0执行和结束编码来开始和做一个步长表
zrc=min(c(:))-1;eoc=zrc-1;RUNS=[65535];
%找到步长变换指针:'plus'包含零运行开始的指针与相适应的minus是它的结束+1
z=c==0;z=z-[0 z(1:end-1)];
plus=find(z==1);minus=find(z==-1);
%从c中删除零运行
if length(plus) ~=length(minus)
c(plus(end):end)=[];c=[c eoc];
end
%删除从c中所有其他零运行(建立在'plus'和'minus')
for i=length(minus):-1:1
run=minus(i)-plus(i);
if run>10
ovrflo=floor(run/65535);run=run-ovrflo*65535;
c=[c(1:plus(i)-1) repmat([zrc 1],1,ovrflo) zrc ...
runcode(run) c(minus(i):end)];
end
end
%霍夫曼编码和加混合。解码信息
y.runs=uint16(RUNS);
y.s=uint16(s(:));
y.zrc=uint16(-zrc);
y.q=uint16(100*q');
y.n=uint16(n);
y.huffman=mat2huff(c);
im2jpeg2k.m
最新推荐文章于 2023-05-12 22:19:44 发布