嵌入式小波零树编码压缩

嵌入式小波零树编码压缩
嵌入式小波零树编码压缩

嵌入式小波零树(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

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,an tiQuantiMat,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)算法的过程详解和Matlab代码(4)运行示例收藏

最后,我们以一幅64*64的Lena局部图像来演示EZW算法的编解码效果。

首先给出相关的编解码主程序。

function y=ezw(Im,imDim,codeDim,DecodeDim)

global row col

[row,col]=size(Im);

% ----- Wavedec -----%

DecIm=mywavedec2(Im,imDim);

% ----- Select threshold -----%

MaxDecIm=max(max(abs(DecIm)));

T=zeros(1,codeDim);

T(1)=2^flor(log2(MaxDecIm));

for i=2:codeDim

T(i)=T(i-1)/2;

end

% ----- EZW coding -----%

[CodeList,LenSubCL,QuantiFlagList,LenSubQFL]=ezwcode(DecIm,T,codeDim);

% ----- EZW decoding -----%

DecodeMat=ezwdecode(DecIm,T(1),DecodeDim,CodeList,LenSubCL,QuantiFlagLis t,LenSubQFL);

% ----- Waverec -----%

DecIm(1:row/8,1:col/8)

DecodeMat(1:row/8,1:col/8)

RecIm=mywaverec2(DecodeMat,imDim);

function [CodeList,LenSubCL,QuantiFlagList,LenSubQFL]=ezwcode(Mat,threshold, codedim)

global row col

scanlist=morton(Mat);

flaglist(1:row,1:col)='Z';

imptvalue=[];

imptflag=[];

% ----- Intializing EZW coding output variables -----%

CodeList=[];

LenSubCL=[];

QuantiFlagList=[];

LenSubQFL=[];

% ----- Coding loop -----%

for d=1:codedim

[imptvalue,imptflag,scancode,scanflag,flaglist]=mainscan(Mat,scanlist,flaglist,i

mptvalue,imptflag,threshold(d));

[quantilist,quantiflag,recvalue,quantifierMat]=assistscan(imptvalue,d,threshold (1));

% Produce code dataflow

CodeList=[CodeList,scancode];

LenSubCL=[LenSubCL,length(scancode)];

QuantiFlagList=[QuantiFlagList,quantiflag'];

LenSubQFL=[LenSubQFL,length(quantiflag)];

end

function DecodeMat=ezwdecode(Mat,T1,decodeDim,CodeList,LenSubCL,QuantiFla gList,LenSubQFL)

global row col

recvalue=[];

rIlist=[];

quantiflagOld=[];

scanorder=listorder(row,col,1,1);

flagMat(1:row,1:col)='Z';

for level=1:decodeDim

scancode=CodeList(1:LenSubCL(level));

CodeList=CodeList(LenSubCL(level)+1:end);

quantiflag=QuantiFlagList(1:LenSubQFL(level));

QuantiFlagList=QuantiFlagList(LenSubQFL(level)+1:end);

DecodeMat=Mat;

qrNum=1;

scNum=1;

[antiQuantiMat,rIlist,quantiflagOld]=antiquantifier(T1,level,rIlist,quantiflag,qua ntiflagOld);

[DecodeMat,recvalue,qrNum]=updateRecvalue(DecodeMat,recvalue,qrNum,qu antiflag,antiQuantiMat,rIlist);

[DecodeMat,flagMat,recvalue]=decoding(DecodeMat,flagMat,recvalue,antiQua ntiMat,quantiflag,rIlist,scanorder,scancode,scNum,qrNum);

% if level

% button = questdlg('Need the nest decode processing ?','Decode Level',' Yes','No','Yes');

% if button(1)=='N'

% break;

% end

% end

end

(1)图像3级分解、5级编码、5级解码下的效果图。

ezw(Im64,3,5,5);

分解矩阵DecIm的部分数据

40.9531 87.2344 94.2188 161.2031 64.3125 40.4063 37.5781 65.6 875

110.8281 129.3125 91.5625 164.3750 107.1719 50.5469 34.9688 75. 2188

150.7813 134.5156 98.0625 164.9688 121.7344 67.5469 28.0938 77. 1250

132.9219 117.7656 91.0938 155.3125 117.0781 53.0781 28.1563 83. 3750

119.3281 118.5156 95.1875 137.1719 105.8750 30.3906 33.6094 79. 6406

100.8906 102.9375 119.2031 132.8438 71.5000 28.6875 38.5313 75. 3281

103.2813 85.3750 102.6250 107.4531 31.3594 28.2656 45.3438 79. 7813

98.4844 120.0938 134.8438 73.3281 29.1719 33.6094 50.3906 86. 0781

解码矩阵DecodeMat的对应数据

42 86 94 162 66 42 38 66

110 130 90 166 106 50 34 74

150 134 98 166 122 66 30 78

134 118 90 154 118 54 30 82

118 118 94 138 106 30 34 78

102 102 118 134 70 30 38 74

102 86 102 106 30 30 46 78

98 122 134 74 30 34 50 86

运行效果:

(2)图像3级分解、10级编码、8级解码下的效果图。

ezw(Im64,3,10,8);

分解矩阵DecIm的部分数据

40.9531 87.2344 94.2188 161.2031 64.3125 40.4063 37.5781 65.6 875

110.8281 129.3125 91.5625 164.3750 107.1719 50.5469 34.9688 75. 2188

150.7813 134.5156 98.0625 164.9688 121.7344 67.5469 28.0938 77. 1250

132.9219 117.7656 91.0938 155.3125 117.0781 53.0781 28.1563 83. 3750

119.3281 118.5156 95.1875 137.1719 105.8750 30.3906 33.6094 79. 6406

100.8906 102.9375 119.2031 132.8438 71.5000 28.6875 38.5313 75. 3281

103.2813 85.3750 102.6250 107.4531 31.3594 28.2656 45.3438 79. 7813

98.4844 120.0938 134.8438 73.3281 29.1719 33.6094 50.3906 86.

0781

解码矩阵DecodeMat的对应数据

40.7500 87.2500 94.2500 161.2500 64.2500 40.2500 37.7500 65.7 500

110.7500 129.2500 91.7500 164.2500 107.2500 50.7500 34.7500 75. 2500

150.7500 134.7500 98.2500 164.7500 121.7500 67.7500 28.2500 77. 2500

132.7500 117.7500 91.2500 155.2500 117.2500 53.2500 28.2500 83. 2500

119.2500 118.7500 95.2500 137.2500 105.7500 30.2500 33.7500 79. 7500

100.7500 102.7500 119.2500 132.7500 71.7500 28.7500 38.7500 75. 2500

103.2500 85.2500 102.7500 107.2500 31.2500 28.2500 45.2500 79. 7500

98.2500 120.2500 134.7500 73.2500 29.2500 33.7500 50.2500 86. 2500

运行效果:

EZW算法的过程详解和Matlab代码(1)构建扫描次序表(修正小波树结构)收藏

前段时间,我们讨论了嵌入式小波零树算法的基本原理。(https://www.360docs.net/doc/a1504413.html,/chenyusiy uan/archive/2007/11/16/1888968.aspx)一个多星期过去了,我根据自己对算法的理解,编写出EZW算法的Matlab程序,可以实现图像的任意级别的小波分解和重构、以及任意精度的EZW编解码过程。下面,我们以一幅16*16的Lena局部图像经过3级小波分解后的小波数据为例详细的说明EZW算法的编解码过程,并给出相应的Matlab代码。原始图像如下

分解后的小波图像数据为:

一、在开始编码之前,首先要求出初始阈值T1:

MaxDecIm=max(max(abs(DecIm)));

T=zeros(1,codeDim);

T(1)=2^flor(log2(MaxDecIm));

二、然后是建立小波树结构,构建扫描次序表。这个扫描次序表非常重要,后面的编码、解码过程都要按照扫描次序表逐个处理数据矩阵的各个元素。构建过程如下:用(r,c)表示数据矩阵上各元素的位置。row、col作为全局变量,表示数据矩阵的行、列数。

1、小波树结构的特点:

(1)对于LL-N低频子带的点(r,c),有3个孩子:(r,c+W)、(r+H,c)和(r+H,c+W),其中W、H分别是LL-N子带的宽和高;

(2)第N~2高频子带(LH、HL、HH)的点都有4个孩子,即:tp=[2*r-1,2*c-1;2*r-1,2 *c;2*r,2*c-1;2*r,2*c];

(3)第1高频子带的点没有孩子。根据小波树的这个特点,可编写如下“小波树”函数treeMat (),输入矩阵内任一点的位置(r,c),给出该点的子孙列表cp 。

function cp=treeMat(r,c) %这个函数是一个递归函数

global row col dim % dim是小波分解级数

HLL=row/2^dim;

WLL=col/2^dim;

if (r<=HLL)&&(c<=WLL)

tp1=[r,c+WLL;r+HLL,c;r+HLL,c+WLL];

cP=[tp1;treeMat(r,c+WLL);treeMat(r+HLL,c);treeMat(r+HLL,c+WLL)];

elseif (r>row/2)||(c>col/2)

cP=[];

else

tp=[2*r-1,2*c-1;2*r-1,2*c;2*r,2*c-1;2*r,2*c];

tm1=[];tm2=[];tm3=[];tm4=[];

if (tp(4,1)<=row/2)&&(tp(4,2)<=col/2)

t1=treeMat(tp(1,1),tp(1,2));

tm1=[tm1;t1];

t2=treeMat(tp(2,1),tp(2,2));

tm2=[tm2;t2];

t3=treeMat(tp(3,1),tp(3,2));

tm3=[tm3;t3];

t4=treeMat(tp(4,1),tp(4,2));

tm4=[tm4;t4];

end

cP=[tp;tm1;tm2;tm3;tm4];

end

示例,当row=8,col=8,dim=2时,LL-N低频子带的点(1,1) (1,2) (2,1) (2,2) 的子孙分布如下:

由这个小波树列表tree_p,我们可以进一步构建函数childMat(),给出矩阵数据Mat和矩阵任一点的位置(r,c),返回该点的子孙数据列表chMat。

function chMat=childMat(Mat,chRows,chCols)

global row col dim

chPoint=treeMat(chRows,chCols);

chMat=[];

[mRows,mCols]=size(chPoint);

for iRows=1:mRows

chMat=[chMat;chPoint(iRows,1),chPoint(iRows,2),Mat(chPoint(iRows,1),chPoint (iRows,2))];

end

2、构建扫描次序表

本文EZW算法的扫描次序为Morton式,其特征是从(1,1)开始,每4个点组成一个“Z”型扫描单元,从微观到宏观上都是严格的“Z”型结构,可以用递归方法来构建扫描次序表。扫描次序表scanlist由两部分组成,一个是将数据矩阵Mat按照morton扫描次序转换成数据列表matlist,一个是按照扫描次序组成的矩阵各点位置的(r,c)列表lsorder。

function scanlist=morton(Mat)

global row col

matlist=mat2list(Mat);

scanorder=listorder(row,col,1,1);

scanlist=[];

for i=1:row*col

scanlist=[scanlist;i scanorder(i,:) matlist(i)];

end

function mls=mat2list(Mat) % 该函数为递归函数

[r,c]=size(Mat);

if (r==2)&&(c==2)

mls=[Mat(1,1);Mat(1,2);Mat(2,1);Mat(2,2)];

else

M1=Mat(1:r/2,1:c/2);

M2=Mat(1:r/2,c/2+1:c);

M3=Mat(r/2+1:r,1:c/2);

M4=Mat(r/2+1:r,c/2+1:c);

lt1=mat2list(M1);

lt2=mat2list(M2);

lt3=mat2list(M3);

lt4=mat2list(M4);

mls=[lt1;lt2;lt3;lt4];

end

function lsorder=listorder(mr,mc,pr,pc) % 该函数为递归函数

lso=[pr,pc;pr,pc+mc/2;pr+mr/2,pc;pr+mr/2,pc+mc/2];

mr=mr/2;mc=mc/2;

lm1=[];lm2=[];lm3=[];lm4=[];

if (mr>1)&&(mc>1)

ls1=listorder(mr,mc,lso(1,1),lso(1,2));

lm1=[lm1;ls1];

ls2=listorder(mr,mc,lso(2,1),lso(2,2));

lm2=[lm2;ls2];

ls3=listorder(mr,mc,lso(3,1),lso(3,2));

lm3=[lm3;ls3];

ls4=listorder(mr,mc,lso(4,1),lso(4,2));

lm4=[lm4;ls4];

end

lsorder=[lso;lm1;lm2;lm3;lm4];

len=length(lsorder);

lsorder=lsorder(len-mr*mc*4+1:len,1:2);

嵌入式小波零树(EZW)算法的过程详解和Matlab代码(2)编码过程(0812 27-补充quantifier程序)收藏

首先根据实际需要确定扫描次数D=codeDim,然后进行D次主扫描和辅扫描。

1、初始化

首先获取扫描次序表scanlist,表中每行的数字依次是该元素的(1)扫描序号、(2)对应于数据矩阵中位置的行号r、(3)对应于数据矩阵中位置的列号c、(4)值Mat(r,c),即

scanlist (i) = [ i, r, c, Mat(r, c) ]

编码扫描的对象就是次序表scanlist,而非数据矩阵Mat。然后构建初始符号矩阵flagMat,其中每个元素均为字符“Z”。

2、主扫描

在第d次(1<= d <=codeDim)扫描中,输入阈值为T(d),首先依次对次序表的每一行scanlist(i)按照如下步骤扫描:

(1)如果上一次扫描得到的flagMat中,处于位置(r,c)的符号为“O”,则表示相应的Mat(r,c)是重要的,不需要通过本次扫描再次编码,故作跳过处理。

(2)将scanlist(i,4)(即Mat(r,c))的绝对值与阈值T(d) 比较,如果是重要的系数,则令flagMat(r,c)的值为P或N,并存入主扫描表scancode中,并将Mat(r,c)的值以及相应的行、列数(r,c)存入重

要数列表imptvalue中,将符号P或N存入重要数符号列表imptfla g中。

(3)如果是不重要的系数,则首先检查flagMat(r,c),若是符号“X”,则表示这个点是不重要的,作跳过处理不再扫描。

(4)如果点(r,c)处于第一分解级,即r>row/2或c>col/2,没有子孙系数,且其系数是不重要的,则该点flagMat的符号为Z,存入主扫描表scancode中。

(5)如果点(r,c)满足r

至此,扫描结束。然后,将扫描后得到的符号矩阵flagMat转存到sc anflag中,再将flagMat中的字符P、N都置换为O,字符X和T都置换为Z,使得flagMat的元素只有字符O、Z两种,作为输出到下一次扫描中使用。

function [imptvalue,imptflag,scancode,scanflag,flaglist]=mai nscan(Mat,scanlist,flaglist,imptvalue,imptflag,threshold) global row col

scancode=[];

for i=1:row*col

嵌入式小波零树(EZW)算法

首先根据实际需要确定扫描次数D=codeDim,然后进行D次主扫描和辅扫描。 1、初始化 首先获取扫描次序表scanlist,表中每行的数字依次是该元素的(1)扫描序号、(2)对应于数据矩阵中位置的行号r、(3)对应于数据矩阵中位置的列号c、(4)值Mat(r,c),即 scanlist (i) = [ i, r, c, Mat(r,c) ]编码扫描的对象就是次序表scanlist,而非数据矩阵Mat。然后构建初始符号矩阵flagMat,其中每个元素均为字符“Z”。 2、主扫描 在第d次(1<= d <=codeDim)扫描中,输入阈值为T(d),首先依次对次序表的每一行scanlist(i)按照如下步骤扫描: (1)如果上一次扫描得到的flagMat中,处于位置(r,c)的符号为“O”,则表示相应的Mat(r,c)是重要的,不需要通过本次扫描再次编码,故作跳过处理。 (2)将scanlist(i,4)(即Mat(r,c))的绝对值与阈值T(d) 比较,如果是重要的系数,则令flagMat(r,c)的值为P或N,并存入主扫描表scancode中,并将Mat(r,c)的值以及相应的行、列数(r,c)存入重要数列表imptvalue中,将符号P或N存入重要数符号列表imptflag中。(3)如果是不重要的系数,则首先检查flagMat(r,c),若是符号“X”,则表示这个点是不重要的,作跳过处理不再扫描。

(4)如果点(r,c)处于第一分解级,即r>row/2或c>col/2,没有子孙系数,且其系数是不重要的,则该点flagMat的符号为Z,存入主扫描表scancode中。 (5)如果点(r,c)满足r=threshold if scanlist(i,4)>=0 flaglist(scanlist(i,2),scanlist(i,3))='P'; scancode=[scancode 'P']; imptvalue=[imptvalue;abs(scanlist(i,4)),scanlist(i,2),scanlist(i,3)]; imptflag=[imptflag 'P'];

零树编码算法小波系数

零树编码算法 一零树编码算法的基本思想 众所周知,小波系数的能量集中程度越高,需要编码的系数越少,编码所需的比特数就越少,所以小波压缩都是利用变换分解后的图象能量分布集中这一特性来编码的。小波系数的能量集中程度对图象编码非常重要,而不同层次上,相同空间滤波方向上的小波系数之间的相关性也非常重要。零树编码的基本思想就是基于这种相关性。 经过小波变换后的图象被分解成若干个子频带,其中子带HH是低频分量,是原始图象的平滑版本,子带HL是水平方向上的高频,垂直方向上的低频分量;子带LH是垂直方向上的高频,水平方向的低频分量;子带HH是高频分量,揭示了原始图象在斜方向的边缘信息。 为了提高对小波系数的压缩性能,Jerome M. Shapiro提出了一种新的数据结构零树(zerotree),如果小波系数x的绝对值小于给定的阈值T,则此系数是可以忽略的。零树的方法是基于这样一个假设:如果在较粗的级别上,一个小波系数是小于阈值,可以忽略的,则所有在相同方向,相同位置的更高的级别上的系数也基本上是可以忽略不记的。经验证明这个假设通常是正确的。更特殊的情况下,在一个多级的子带系统里,除了最高频的子带之外,在每一级别的每个系数都是和该系数在更高的级别相同方位的系数集合相对应的,我们把在较粗的级别上的系数叫做父亲,而在所有在更高的级别上相应位置的系数都叫做后代,同样的,对于任一给定的后代,在更粗的级别上相同方位上对应的系数叫做祖先。 对于一个QMF-金字塔算法的子带分解,如图所示,除了最低频的子带之外,所有的父亲结点都有4个儿子,而最低频的结点是有3个儿子。对系数的扫描顺序的原则是不可以有一个儿子结点是在它的父亲结点之前被扫描。对于一个N 级的变换,扫描是先从最低频的子带开始的,这里记作LLn,然后扫描子带HLn,LHn,和HHn,然后扫描第n-1级的系数,以此类推。在金字塔分解中这种扫描模式的图示见下图,可以看到在一个给定的子带每个系数都是在下一个子带的对应系数之前被扫描的。 x和它的所

嵌入式小波零树编码压缩

嵌入式小波零树(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),在随后的第

嵌入式零树小波EZW编码及其算法改进

嵌入式零树小波EZW编码及其算法改进 在基于小波变换的1. 嵌入式零树小波编码算法EZW 1. 1 算法原理: 内嵌编码[1](embedded coding)就是编码器将待编码的比特流按重要性的不同进行排序,根据目标码率或失真度大小要求随时结束编码;同样,对于给定 码流解码器也能够随时结束解码,并可以得到相应码流截断处的目标码率的恢 复由一副EZW 算法利用小波系数的特点较好地实现了1) 零树预测 一副经过小波变换的定义一个零树的数据结构:一个小波系数x,对于 一个给定的门限T,如果|x| 2) 用零树结构编码重要重要3) 逐次逼近量化(Successive-Approximation Quantization,SAQ) 内嵌编码的核心在于采用了逐次逼近的量化方法(SAQ)。SAQ 按顺序使 用了一系列阈值T0、T1,┄,TN-1 来判决重要性,其中Ti=Ti-1/2,初始阈值 T0 按如下条件选择,OXjO2T0,其中Xj 表示所有变换系数。 在编(译)码过程中,始终保持着两个分离的列表:主表和辅表。主表对 应于编码中的不重要的集合或系数,其输出信息起到了恢复各重要值的空间位 置结构的作用,而辅表是编码的有效信息,输出为各重要系数的二进制值。编 码分为主、辅两个过程:在主过程中,设定阈值为Ti,按上述原理对主表进行扫 描编码,若是重要系数,则将其幅值加入辅表中,然后将该系数在数组中置为零,这样当阈值减小时,该系数不会影响新零树的出现;在辅过程中,对辅表中 的重要系数进行细化,细化过程类似于比特平面编码。对阈值Ti 来说,重要系 数的所在区间为[Ti,2Ti],若辅表中的重要系数位于[Ti,3Ti/2],则用符号0 表示,否则用符号1 表示。编码在两个过程中交替进行,在每个主过程前将阈值减半。

零树小波图像压缩

零树小波图像压缩专题(1) 默认分类 2008-06-14 20:05:49 阅读51 评论0字号:大中小订阅 前几天我们讨论了几种简单的小波图像压缩方案,不过这些技术都比较粗糙,效率低。现在我们从小波编码起步,探讨几种高效的小波压缩方案。 信号的传输和处理少不了编码技术的支持,信号编码可以极大地压缩信息量,增强抗干扰能力等。同样地,小波变换作为一种信号处理技术,也有其独特的编码结构。在《基于小波变换的图像压缩技术初探》一文中,我们提到,二维小波变换具有塔式结构,如图1 图1 那么这种塔式结构里,小波系数和相应的位置信息的组织关系是怎样的呢?仔细观察图1,我们可以发现,各个子图像(或称子频带)之间组成了一个从低频带指向高频带的树状结构,如图2所示: 图2

图2中,以HH3单个元素为根形成的子孙树,从它们的方向和空间位置可以看出,这种小波树中,各级分解子带的系数之间存在很大的相似性!基于这一性质,Lewis和Knowles在1992年提出了小波零树编码算法。这种算法的一大特点,也是一大缺点,即量化后系数为0的系数的子孙系数也置0。这种一刀切的处理很容易把重要的子孙系数忽略掉,故L-K零树编码算法存在一定的不足。 零树小波图像压缩专题(2)——EZW算法的原理步骤 默认分类 2008-06-14 20:08:33 阅读99 评论0字号:大中小订阅 如果一个小波系数被量化为0,而它存在一个子孙量化后不为0,则这个点称为孤立零点。适应孤立零点的情况而改进的零树编码算法就称为嵌入式零树小波编码算法,简称EZW 算法,是Shapiro在1993年提出的。 对于一个阈值T,若小波系数x满足|x| >= T ,则称x关于T是重要的系数,反之称x关于T是不重要的系数;若x是不重要的系数,并且其所有子孙都是不重要的,则称x是关于T的零树根;若x本身是不重要的系数,但它存在重要的子孙,则称x是关于T的孤立零点。 对于给定的阈值,EZW算法下图所示的Z型顺序扫描、处理小波系数(扫描顺序有两种:raster、Morton)。

小波用于编码―――零树编码方案-Read

小波用于编码 ――― 零树编码方案 1 小波变换应用于图像压缩编码 用小波变换的方法进行图像数据的压缩编码是变换编码的一种,将时域信号变换到小波域后会得到一个多分辨率、能量集中的系数空间。能量越集中,系数被压缩的程度就越大。 早在小波分析出现之前,人们就试图用多分辨率分析的思想对信号进行处理,以突破傅立叶变换的局限性,最著名的是Burt 和Adelson 的Laplace 金字塔编码;后来,Mallat[11]提出了小波多分辨率分析算法;Daubechies 用基于离散滤波器迭代的方法构造了紧支集的规范正交小波基,使小波分解可以用信号和离散滤波器的卷积运算来实现,从而使小波分解被广泛应用于图像分解。 正交小波对应一个正交镜像滤波器,就是说低通滤波器h 和高通滤波器g 正交。双正交小波有两个小波,即小波Ψ和它的对偶小波ψ~ ,它们对应的滤波器分别为{h,g }和{g h ~,~}。其中,h 与g ~正交,g 与h ~正交,即满足: 1n n n h )1(g ~+--=;1n n n h ~)1(g +--=;)5.3(h ~h 0 ,k n k 2n n δ=∑+ 进行图像的压缩编码时,用一个小波分解,用另一个重构。母波选择的合适与否直接影响着图像编码的结果,正交小波的变换明显的不如双正交小波。本文采用的均是附录二中介绍的双正交小波。 小波变换是变换编码的一种,也要经过变换、量化和压缩三个步骤。将原始图像进行离散小波变换(DWT )后,如果立即进行相应的逆变换,会得到精确的原始图像,当然这要忽略在计算时带来的误差。 对于一幅图像所得到的小波系数的能量要比在时域时集中的多,这样就很有利于将其量化为字符流。现代的量化方法有很多:如:标量量化、向量量化和零树编码量化等都是非常有效的。最后要对得到的字符流进行无损压缩,这要用到一些经典的方法,如:Huffman 、ADPCM 、RLE 等。 下面将讨论一种零树编码量化的方法。

基于小波变换的图像压缩技术

ISSN1009-3044 ComputerKnowledgeandTechnology电脑知识与技术V01.6,No.3January2010,PP.698—700 E—mail:eduf@CCCC.net.eii http://www.dnzs.net.cnTeh+86—55l一56909635690964 基于小波变换的图像压缩技术 闫凡勇,张颖,张有志,白红成 (上海海事大学信息工程学院,上海200135) 摘要:小渡分析在图像处理中有很重要的应用,包括图像压缩,图像去噪等。二维小波分析用于图像压缩是小波分析应用的一个重要方面。该论文主要分析了EZW算法思想,并通过Madab仿真说明小波变换理论在图像处理中所发挥的重要作用。 关键词:小波变换;图像压缩;EZW 中图分类号:TPl8文献标识码:A 文章编号:1009-3044(2010)03-698埘 ResearchofImageCompressionBasedonWaveletTransform YANFan—yong,ZHANGYing.ZHANGYou—zhi.BAIHong—cheng (ShoolofInformationan-.1Engineeringsllarl西1aiMaritimeUniversity,shanghai200135,chir扭) Abstract:Thewaveletanalysishassomeimportantapplicationsinimageprocessing,includingimagecompression,imagede—noismgandSOon.Waveletanalysisfor tVl,O—dimensionalin札gecompressionisakeyaspectinthefieldofitsapphcadons.ThepapermainlyanalyzesthetheoryofEZWalgorithm,andillustratesthebetterresultsoftheapplicationsonusmgwaveletdieoryinimageprocessingbasedonMatlabsimulatiom。 Keywords:wavelettransformation;imagecompression;EZW 随着科技的飞速发展.图像编解码技术也正朝着高编码效率和低复杂度的方向不断改善和优化。我们知道图像经过抽样、量化、编码后会含有丰富的数据,但是由于存储空间、传输速率等因素的限制,使得我们在对图像进行存储和传输之前旨先要对图像进行压缩。在保证可恢复原始图像的前提下,尽量减少或消除图像中的冗余,达到存储卒间和传输速率的最佳化,在需要时,再对压缩图像进行解码和复原。快速傅立叶变换、离散余弦变换用于图像压缩时会显现出明显的局限性,通过利用这些技术我们只能得到整个信号的整体频域信息,而不能获得任何时间或空间段上的频域特性。一幅图像在编码之前首先要进行特征提取,比如提取图像纹理、边缘等,这是因为它们都是高度局部性的,显然这两种技术用于图像压缩时效果不理想。被称为“数学显微镜”的小波变换具有明显的时域、频域的局部性,小波分析的出现刚好解决了这一难题,其性能和算法的复杂度上都明显优予以上两种技术。在处理低频数据时.通过降低时域分辨率来提高频域分辨率;在处理高频数据时,可以在较高的时域分辨率下处理数据的局部性特征,从而降低频域分辨率。 1小波分析的基本理论 1.1小波图像压缩编码基本原理 小波图像压缩编码原理是基于MaHat塔式算法的基础1-.提出的。Maltat塔式算法的思想是:在选取好小波基的基础七将一幅图像经过小波变换分解为一许多不同尺度、方向、空间域上局部变化的子带图像。按照这种算法思想把一幅图像经过一次小波变换后分解为4个子图像:LL代表原始图像的特征分量,它包含原始图像的基本内容;LH、HL和HH分别表示垂直向下、水平向右和斜对角线的高频特征分量。它们分别包含了图像数据垂直方向、水平方向与斜对角线方向的边缘、纹理和轮廓等。这里需要说明的是LL子带包含了图像的大部分数据。随后的小波变换都是在上一级变换产生的低频子带(LL)的基础上再进行小波变换。 1.2小波变换在图像压缩中的步骤 小波变换实现图像压缩的一般步骤:首先选择一组合适的正交小波基函数,目的是保证多级小波分解时有正交特性,从而有利于图像压缩编码。其次对所要处理的图像进行多级小波分解,把原始图像分解为低频分最和水平向下、垂直向右以及斜对角线的高频分量。第三,根据所得到的不同频率分量分别实施不同的量化和编码操作。通过利用小波变换算法思想就可以把原始图像数据分解为不同频率分量的子带数据,然后分别对不同频率分量的数据实施不同的编码算法,就达到了对原始图像的压缩目的。 2小波图像压缩算法 目前3个比较经典的小波图像编码分别是嵌入式小波零树图像编码(EZ聊,分层小波树集合分割算法(SPIHT)和优化截断点的嵌入块编码算法(EBCOT)。该论文主要研究了EZW编码算法。‘。 EZW编码算法【1】 Lewis和Nowles等首先提出了零树结构[21.并且第一个实现了零树编码思想,但是Lewis等人提出的算法并不完美。1993年,Shapiro将这种数据结构与比特平面编码技术结合起来,提出了嵌入式零树小波(EZW:EmbededdZero—treeWavelet)编码算法13】。EZW算法中采用的零树结构充分利用了不同尺度问小波系数的相似特性,有效地剔除了对高频小波系数的编码,极大的提高了小波系 收稿日期:2009—10—24 作者简介:闫凡勇(1984-),男,硕士,研究方向为交通通信系统。 698??人工■_I及识别技术????-本栏目责任编辑:唐一东

基于小波的图像压缩比较

图像压缩小波变换算法的比较分析 摘要 本文的基本目标是通过不同的参数,分析小波变换的图像压缩算法的基本理论。所有的算法都是基于静止图像,所涉及到的算法比较分析是小波差缩小波(WDR),空间方向树小波(STW),嵌入式零树小波(EZW)和修改后的分区分层树(SPIHT)。这些算法是更有效的,并提供一个更好的功能,在图像压缩过程中,小波变换处理大量数据量同时,具有很好的去噪性,同时也表现出了很好的压缩性。这些技术在许多图像处理应用中使用。这些技术是通过使用性能参数的峰值信噪比(PSNR)和均方误差(MSE)来比较。 关键词:小波变换;WDR、STW、EZW、SPIHT图像压缩的改进 1.引言 在数字图像处理中,图像的质量的好坏没有一个确定的评判标准。图像质量的好坏决定于外部情况的变化,应该根据情况或应用它正在使用的标准。例如,图像压缩,增强,重构,去噪,用这些方法处理数字图像中的图像质量的变化的检测。但是,本文主要关注的是图像质量,图像压缩的定义:测量原始图像与还原图像的压缩比。 (1)由于原图像上信息由固定位置点来表示,在压缩过程中出现错误。 (2)视觉上的突出错误取决于他们在原始图像中的位置,例如,在图像边缘上的突出错误,或在表面的描述错误会影响识背景的直观感受。 (3)压缩后的图像应该是对原始图像的精确还原,并将原来的“高水平”信息转化为原始图像。效果明显的图像压缩,必须删除所有的图像中不必要的冗余编码和像素间冗余,明确的显示出压缩编码的作用。 数字图像处理定义为:分解和重构图像。在世界图像技术的发展中,图像压缩已经开发出有效率方式来压缩图像。图像压缩在互联网上的一般优点,网页上传和下载时间的减少和降低存储空间中的带宽。图像压缩的问题在于降低了表示一个数字图像所需要的数据。一个好的压缩编码方案都是由许多具体的小波变换压缩方法共同作用,离散余弦变换、预测编码、矢量量化等。小波变换是一种灵活的编码技术,用于时域和频域,用它来分割的图像的信息的近似和细节的子信号。

相关文档
最新文档