1、初始化
(1)全局初始化:包括获取扫描次序列表scanorder,初始化符号矩阵flagMat,创建以下几个空表:重要系数重构列表recvalue,量化器编号列表rIlist,上一次解码用到的辅扫描表quantiflagOld。
(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,quantiflag,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,qrNum,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列储存的是对应于DecodeMat中的行、列号(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
4、解码
解码过程其实与主扫描过程非常类似,按照扫描次序scanorder扫描解码矩阵DecodeMat:
(1) 首先检查对应的flagMat是否为“O”或“X”,是则跳过,扫描下一个元素。
(2) 然后对照主扫描表scancode,作如下操作:
如果为“P”或“N”,则更新flagMat,根据逆量化器重构DecodeMat相应元素的值,并存入重要系数矩阵recvalue中;
如果为“Z”,则DecodeMat相应元素的值置零;
如果为“T”,则更新flagMat,DecodeMat相应元素的值置零,并使该点所有子孙的flagMat置为“X”。
(3)本级解码完毕,保存符号矩阵flagMat到解码符号矩阵Decodeflag中,然后使flagMat中的元素重置为“O”或“Z”,供下一级解码使用。
function [DecodeMat,flagMat,recvalue]=decoding(DecodeMat,flagMat,recvalue,antiQuantiMat,quantiflag,rIlist,scanorder,scancode,scNum,qrNum)
global row col
for r=1:row*col
if flagMat(scanorder(r,1),scanorder(r,2))=='O'
continue;
elseif flagMat(scanorder(r,1),scanorder(r,2))=='X'
continue;
else
if scancode(scNum)=='P'
flagMat(scanorder(r,1),scanorder(r,2))='P';
if quantiflag(qrNum)==1
qValue=antiQuantiMat(rIlist(qrNum),2);
recvalue=[recvalue;qValue,scanorder(r,1),scanorder(r,2)];
DecodeMat(scanorder(r,1),scanorder(r,2))=qValue;
qrNum=qrNum+1;
else
qValue=antiQuantiMat(rIlist(qrNum),1);
recvalue=[recvalue;qValue,scanorder(r,1),scanorder(r,2)];
DecodeMat(scanorder(r,1),scanorder(r,2))=qValue;
qrNum=qrNum+1;
end
scNum=scNum+1;
elseif scancode(scNum)=='N'
flagMat(scanorder(r,1),scanorder(r,2))='N';
if quantiflag(qrNum)==1
qValue=-antiQuantiMat(rIlist(qrNum),2);
recvalue=[recvalue;qValue,scanorder(r,1),scanorder(r,2)];
DecodeMat(scanorder(r,1),scanorder(r,2))=qValue;
qrNum=qrNum+1;
else
qValue=-antiQuantiMat(rIlist(qrNum),1);
recvalue=[recvalue;qValue,scanorder(r,1),scanorder(r,2)];
DecodeMat(scanorder(r,1),scanorder(r,2))=qValue;
qrNum=qrNum+1;
end
scNum=scNum+1;
elseif scancode(scNum)=='Z'
DecodeMat(scanorder(r,1),scanorder(r,2))=0;
scNum=scNum+1;
elseif scancode(scNum)=='T'
flagMat(scanorder(r,1),scanorder(r,2))='T';
DecodeMat(scanorder(r,1),scanorder(r,2))=0;
chTree=treeMat(scanorder(r,1),scanorder(r,2));
[rowch,colch]=size(chTree);
for rc=1:rowch
if flagMat(chTree(rc,1),chTree(rc,2))~='O'
flagMat(chTree(rc,1),chTree(rc,2))='X';
end
end
scNum=scNum+1;
end
end
end
Decodeflag=flagMat;
for i=1:row
for j=1:col
switch flagMat(i,j)
case {'P','N'}
flagMat(i,j)='O';
case {'T','X'}
flagMat(i,j)='Z';
end
end
end
分享到:
相关推荐
嵌入式小波零树编码(EZW)是一种高效、快速的无损图像压缩算法,由Steven J. G. Skodras在1993年提出。它利用小波分析的多分辨率特性,通过编码小波系数的零树结构来减少数据量,达到图像压缩的目的。MATLAB作为...
嵌入式小波零树(EZW)算法是一种高效的图像压缩技术,它基于小波变换并利用了图像数据中的固有特性来实现压缩。EZW算法的核心思想在于利用小波变换后的系数之间的相关性以及图像的多分辨率特性来提高压缩效率。 ####...
嵌入式零树小波(Embedded Zero-Wavelet,简称EZW)编码是一种高效的数据压缩技术,主要用于图像和视频编码领域。它利用了小波分解后的系数分布特性,通过构建和压缩零树来达到较高的压缩比,同时保持较好的重构质量...
EZW算法(Embedded Zerotree Wavelet algorithm),即嵌入式零树小波算法,是一种高效的小波图像压缩算法,由J. Shapiro于1993年提出。EZW算法通过采用小波变换将图像分解为不同分辨率层次的子带,然后对这些子带...
嵌入式零树小波算法在小波变换的基础上,引入了一种基于阈值的压缩策略,即零树结构。在小波分解过程中,如果一个节点的系数小于某个阈值,则认为它是“零”,这个节点及其所有子节点构成的树称为零树。零树的特性...
在基于小波变换的图象压缩方案中,嵌入式零树小波 EZW(Embedded Zerotree Wavelets)[1]编码很好地利用小波系数的特性使得输出的码流具有嵌入特性。近年来,在对EZW改进的基础上,提出了许多新的性能更好的算法,如...
整体而言,EZW算法是一个涉及小波分析、数据编码和优化的复杂过程。在Matlab环境下,这些功能通常通过编写一系列相互配合的函数来实现,以便于理解和调试。通过对这些文件的学习和理解,可以深入掌握EZW算法的工作...
嵌入式零树小波(EZW)算法是一种在数字图像处理领域广泛应用的无损压缩技术,由S. G. Mallat和Z. Zhang于1992年提出。此算法利用了小波分析的多分辨率特性,通过构建零树结构来有效地减少图像数据中的冗余,从而...
嵌入式零树小波(EZW)编码算法是一种广泛应用于图像压缩的方法,它结合了小波变换的多分辨率特性与熵编码的效率。本文将深入探讨EZW算法的原理、实现过程以及使用VC++编程环境的实践方法,并通过MATLAB进行结果分析...
"EZW算法的MATLAB实现" ...EZW算法的MATLAB实现是一个复杂的过程,涉及到多种知识点的结合,如小波变换、零树结构、逆量化器和解码矩阵等。只有通过深入了解这些知识点,才能正确地实现EZW算法的MATLAB实现。
在描述中提到的“EZW图像感知编码算法的Matlab源码”,意味着我们可以找到一套完整的代码,用于实现EZW编码和解码过程,其中可能包括以下几个关键步骤: 1. 图像预处理:对原始图像进行灰度化或色彩空间转换。 2. ...
EZW( Embedded Zerotree Wavelet,嵌入式零树小波)是一种高效的数据压缩算法,主要应用于图像和信号处理领域,尤其是小波分析中。它通过利用数据的统计自相似性和零树结构来实现高压缩比。 描述中提到的"包括EZW,...
EZW解码算法则相反,它根据编码时保存的上下文信息,逆向重建出零树结构,并恢复出所有小波系数。这个过程需要解码器正确解析编码流,识别出非零节点,然后递归地恢复整个树的零节点。 在VC(Visual C++)环境下...
在MATLAB环境中实现EZW算法,可以方便地进行小波分解和重构,从而在科学研究和工程应用中发挥重要作用。 EZW算法的核心思想是基于小波系数的重要性进行编码。它首先将图像通过小波变换分解为多个频域分量,然后按照...
零树小波编码(Embedded Zero-Tree Wavelet,EZW)是一种高效的数据压缩算法,尤其适用于图像和视频数据。在小波分析的基础上,EZW利用了数据的自相似性和空间冗余来实现高效的编码。这一算法由Simon S. Haykin在...
标题中的"ezw.zip_EZW_ezw algorithm_ezw matlab_matlab EZW_matlab EZW"提到了一个关键的图像编码算法——EZW( Embedded Zerotree Wavelet,嵌入式零树小波编码),以及它与MATLAB编程语言的关联。这个压缩包可能...
嵌入式零树小波编码(EZW)是一种图像压缩技术,通过利用小波变换后的系数之间的相关性,能够有效去除图像数据中的冗余信息。零树编码是一种分层的编码技术,通过建立一种树状结构来表示小波系数的层次关系,其中...
EZW(Embedded Zeros within a Wavelet Tree,嵌入零的波let树)是一种无损图像压缩算法,由Steven J. Geller在1993年提出,主要用于提高离散小波变换(DWT,Discrete Wavelet Transform)后的图像数据压缩效率。...
总结起来,小波零树编码是一种有效且灵活的图像压缩技术,利用MATLAB可以方便地实现和优化这一过程。通过理解小波变换、零树结构以及MATLAB中的实现细节,我们可以更好地掌握这一算法,并将其应用于实际的图像处理...