im2jpeg2k.m

%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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值