嵌入式小波零树编码压缩

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式小波零树(EZW)算法的过程详解和Matlab代码(3)解码过程收藏

1、初始化

(1)全局初始化:包括获取扫描次序列表scanorder,初始化符号矩阵flagMat,创建以下几个空表:重要系数重构列表recvalue,量化器编号列表rIlist,上一次解码用到的辅扫描表qu antiflagOld。

(2)每级扫描的初始化:获取本级解码需要的主扫描表scancode和辅扫描表quantiflag。创建解码矩阵DecodeMat,量化符号列表编号qrNum,主扫描表扫描编号scNum。

2、构造逆量化器

(1)逆量化器包括两个部分,一是量化值部分,与编码程序中的量化器函数代码相同;二是量化器编号列表rIlist的构造,这个是难点和重点,把它构造出来,才能解码出重要系数的数值。(2)以下是编码过程中经过4次扫描产生的辅扫描表quantiflag和量化器编号列表rIlist:

Q:0 1 1

R:1 1 1

Q:1 1 1 1 0 0 0 1 1 0

R:2 3 3 1 1 1 1 1 1 1

Q:1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0

R:5 7 7 3 2 2 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Q:0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1……

R:11 14 15 7 4 5 4 6 7 4 2 3 3 2 2 3 3 2 2 2 3 2 3 2 3 2 2 3 2 3 2 3 3 2 2 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1……

仔细观察可以发现两者之间存在一种函数关系:

以第一级扫描产生的三个量化符号(0,1,1)为例,其编号列表为(1,1,1),在随后的第

2、3、4级分解后,量化符号相继变化为(1,1,1)、(1,0,1)、(0,1,1),编号列表相继变化为(2,3,3)、(5,7,7)、(11,14,15),这里有一个规律:(2,3,3)= 2*(1,1,1)+(0,1,1)

(5,7,7)= 2*(2,3,3)+(1,1,1)

(11,14,15)= 2*(5,7,7)+(1,0,1)

这样,我们就得到如下公式:

设r表示扫描级数,则有:rIlist(r) = 2*rIlist(r-1) + quantiflag(r-1)

从而,就可以轻松编写出逆量化器的函数代码:

function [antiQuantiMat,rIlist,quantiflagOld]=antiquantifier(T1,level,rIlist,quantifl ag,quantiflagOld)

antiQuantiMat=[];

maxInterValue=2*T1;

threshold=T1/2^(level-1);

intervalNum=maxInterValue/threshold-1;

for i=1:intervalNum

antiQuantiMat=[antiQuantiMat;threshold*(i+0.25) threshold*(i+0.75)];

end

rIlen=length(rIlist);

flaglen=length(quantiflag);

for r=1:rIlen

rIlist(r)=2*rIlist(r)+quantiflagOld(r);

end

for f=rIlen+1:flaglen

rIlist(f)=1;

end

quantiflagOld=quantiflag;

3、提高上一级解码的重要系数的重构精度

这里主要是根据逆量化器生成的重构值矩阵antiQuantiMat和逆量化器编号列表rIlist来更新重要系数列表recvalue的值,并将更新数据存入解码矩阵DecodeMat中。这四个矩阵(列表)的每一行(个)元素都是一一对应的关系,更新就很容易实现,代码如下:

function [DecodeMat,recvalue,qrNum]=updateRecvalue(DecodeMat,recvalue,qrN um,quantiflag,antiQuantiMat,rIlist)

if ~isempty(recvalue)

[rvRow,rvCol]=size(recvalue);

for i=1:rvRow

if quantiflag(qrNum)==1

qValue=antiQuantiMat(rIlist(qrNum),2);

if recvalue(i)<0

qValue=-qValue;

end

recvalue(i,1)=qValue;

DecodeMat(recvalue(i,2),recvalue(i,3))=qValue;

qrNum=qrNum+1; % recvalue矩阵的第2、3列储存的是对应于DecodeMa t中的行、列号(r,c)

else

qValue=antiQuantiMat(rIlist(qrNum),1);

if recvalue(i)<0

qValue=-qValue;

end

recvalue(i,1)=qValue;

DecodeMat(recvalue(i,2),recvalue(i,3))=qValue;

qrNum=qrNum+1;

end

end

end

相关文档
最新文档