`
womendu
  • 浏览: 1513629 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

讨论:一种基于状态位图的SPIHT改进算法(2)——编解码程序

阅读更多


根据上一篇文章提及的改进算法步骤,编写了如下主要代码,其他的相关程序,例如childMat()、coef_DOL()、SnOut()、fracnum2bin()等函数的代码,请参阅我之前发布的SPIHT算法过程详解与Matlab实现的文章,主要代码如下:

function RecIm=spiht(Im,imDim,codeDim,decodeDim)

global rMat cMat

% ----- 起始时间 ----- %
strtime=cputime;

[rMat,cMat]=size(Im);
% ----- 小波分解 ----- %
DecIm=mywavedec2(Im,imDim);
% ----- M_SPIHT Coding ----- %
[T,SnList,RnList]=spihtcoding(DecIm,codeDim);
% ----- M_SPIHT Decoding ----- %
DecodeMat=spihtdecoding(T,SnList,RnList,decodeDim);
% ----- 小波重构 -----%
RecIm=mywaverec2(DecodeMat,imDim,decodeDim);

% ----- 运行时间 ----- %
runtime=cputime-strtime

function [T,SnList,RnList]=spihtcoding(DecIm,codeDim)
% 函数 SPIHTCODING() 是SPIHT算法的编码主程序
% 输入参数:DecIm ——小波分解系数矩阵;
% imDim ——小波分解层数;
% codeDim ——编码级数。
% 输出参数:T —— 初始阈值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)为小波系数矩阵的元素
% SnList —— 排序扫描输出位流

global Mat rMat cMat
% Mat是输入的小波分解系数矩阵,作为全局变量,在编码的相关程序中使用
% rMat、cMat是Mat的行、列数,作为全局变量,在编码、解码的相关程序中使用

%-----------------------%
% ----- Threshold ----- %
%-----------------------%
Mat=DecIm;
MaxMat=max(max(abs(Mat)));
N=floor(log2(MaxMat));
T=2^N;
% 公式:N=floor(log2(max{|c(i,j)|})),c(i,j)为小波系数矩阵的元素

%----------------------------------%
% ----- Output Intialization ----- %
%----------------------------------%
SnList=[];
RnList=[];
FlagCoef=zeros(rMat,cMat);
FlagDch=zeros(rMat/2,cMat/2);
FlagLch=zeros(rMat/2,cMat/2);
FlagLch(1,1)=1;
scanorder=listorder(rMat/2,cMat/2,1,1);
%-------------------------%
% ----- Coding Loop ----- %
%-------------------------%
for d=1:codeDim
Sn=[];
Rn=[];
% 对系数C(0,0)单独编码
if FlagCoef(1,1)==1
[biLSP,Np]=fracnum2bin(abs(Mat(1,1)),N);
Rn=[Rn,biLSP(Np)];
else
[isImt,Sign]=SnOut([1 1],N);
if isImt
Sn=[Sn,1,Sign];
FlagCoef(1,1)=1;
else
Sn=[Sn,0];
end
end
% 扫描 FlagDch
for i=1:rMat*cMat/4
rD=scanorder(i,1);
cD=scanorder(i,2);
if FlagDch(rD,cD)==1
chO=coef_DOL(rD,cD,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
if FlagCoef(rO,cO)==1
[biLSP,Np]=fracnum2bin(abs(Mat(rO,cO)),N);
Rn=[Rn,biLSP(Np)];
else
[isImt,Sign]=SnOut([rO,cO],N);
if isImt
Sn=[Sn,1,Sign];
FlagCoef(rO,cO)=1;
else
Sn=[Sn,0];
end
end
end
end
end
% 扫描 FlagLch
for i=1:rMat*cMat/4
rL=scanorder(i,1);
cL=scanorder(i,2);
if FlagDch(rL,cL)==0
chD=coef_DOL(rL,cL,'D');
isImt=SnOut(chD,N);
if isImt
Sn=[Sn,1];
FlagDch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
[isImt,Sign]=SnOut([rO,cO],N);
if isImt
Sn=[Sn,1,Sign];
FlagCoef(rO,cO)=1;
else
Sn=[Sn,0];
end
end
chL=coef_DOL(rL,cL,'L');
if isempty(chL)
FlagLch(rL,cL)=0;
else
isImt=SnOut(chL,N);
if isImt
Sn=[Sn,1];
FlagLch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
FlagLch(rO,cO)=1;
end
else
Sn=[Sn,0];
end
end
else
Sn=[Sn,0];
end
end
end
N=N-1;
SnList=[SnList,Sn,7];
RnList=[RnList,Rn,7];
% 数字‘7’作为区分符,区分不同编码级的Rn、Sn位流
end

function DecodeMat=spihtdecoding(T,SnList,RnList,decodeDim)
% 函数 SPIHTDECODING() 是SPIHT算法的解码主程序
% 输入参数:T —— 初始阈值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)为小波系数矩阵的元素
% SnList —— 排序扫描输出位流
% RnList —— 精细扫描输出位流
% decodeDim —— 解码级数
% 输出参数:DecodeMat —— 解码后重构的小波系数矩阵


global rMat cMat
% rMat、cMat是Mat的行、列数,作为全局变量,在编码、解码的相关程序中使用

%-------------------------------------------%
% ----- Decoding Input Initialization ----- %
%-------------------------------------------%
N=log2(T);
% 获取初始阈值的指数-N
DecodeMat=2^(N-decodeDim)*rand(rMat,cMat);
% 初始化重构矩阵为一个随机矩阵,其元素最大值小于最高级解码阈值的二分之一
% 这样就可以保证未被扫描赋值的区域有一定的灰度,避免重构图像出现色块

Sn=[];
FlagCoef=zeros(rMat,cMat);
FlagDch=zeros(rMat/2,cMat/2);
FlagLch=zeros(rMat/2,cMat/2);
FlagLch(1,1)=1;
scanorder=listorder(rMat/2,cMat/2,1,1);
%-------------------------%
% ----- Decoding Loop ----- %
%-------------------------%
for d=1:decodeDim
[Sn,SnList]=getflow(SnList);
[Rn,RnList]=getflow(RnList);
% 对系数C(1,1)单独编码
if FlagCoef(1,1)==1
[DecodeMat,Rn]=decRefine(DecodeMat,Rn,N,1,1);
else
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(1,1)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(1,1)=-1.5*2^N;
end
FlagCoef(1,1)=1;
else
Sn(1)=[];
DecodeMat(1,1)=0;
end
end
% 扫描 FlagDch
for i=1:rMat*cMat/4
rD=scanorder(i,1);
cD=scanorder(i,2);
if FlagDch(rD,cD)==1
chO=coef_DOL(rD,cD,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
if FlagCoef(rO,cO)==1
[DecodeMat,Rn]=decRefine(DecodeMat,Rn,N,rO,cO);
else
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(rO,cO)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(rO,cO)=-1.5*2^N;
end
FlagCoef(rO,cO)=1;
else
Sn(1)=[];
DecodeMat(rO,cO)=0;
end
end
end
end
end
% 扫描 FlagLch
for i=1:rMat*cMat/4
rL=scanorder(i,1);
cL=scanorder(i,2);
if FlagDch(rL,cL)==0
if Sn(1)==1
Sn(1)=[];
FlagDch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
if Sn(1)==1
Sn(1)=[];
if Sn(1)==1
Sn(1)=[];
DecodeMat(rO,cO)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(rO,cO)=-1.5*2^N;
end
FlagCoef(rO,cO)=1;
else
Sn(1)=[];
DecodeMat(rO,cO)=0;
end
end
chL=coef_DOL(rL,cL,'L');
if isempty(chL)
FlagLch(rL,cL)=0;
else
if Sn(1)==1
Sn(1)=[];
FlagLch(rL,cL)=1;
chO=coef_DOL(rL,cL,'O');
row=size(chO,1);
for j=1:row
rO=chO(j,1);
cO=chO(j,2);
FlagLch(rO,cO)=1;
end
else
Sn(1)=[];
end
end
else
Sn(1)=[];
end
end
end
N=N-1;
end

我使用的是Matlab r2007b,小波分解用的是自己编写的Haar二维小波分解程序。对一幅64*64的Girl灰度图像进行SPIHT编码、解码,程序给运行结果:

1、按照我前天的文章《多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(2)数学表述》介绍的SPIHT算法步骤编写的程序来进行编、解码,3级小波分解和重构,7级编码,7级解码,程序运行时间是:

runtime = 6.8281




2、按照本文所提到的改进算法编写的上述程序来编、解码,同样是3级小波分解和重构,7级编码,7级解码,程序运行时间是:

runtime = 9.5313



编解码速度反而下降了,这里的原因是什么呢?欢迎有兴趣的朋友发表评论或者Email交流!

分享到:
评论

相关推荐

    SPIHT编解码源码

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)是一种高效的图像压缩算法,主要基于小波变换。此算法由Sheikhalishahi、Pantell和Ebrahimi于1996年提出,它利用了图像数据的统计自适应特性,通过...

    spiht改进算法(matlab)

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)是一种用于图像压缩的算法,它基于小波变换。SPIHT算法以其高效、高压缩率和良好的图像重构质量而闻名,尤其适用于医学图像和遥感图像的压缩。在本...

    基于小波变换的SPIHT算法源码

    SPIHT(小波域中的分层树结构分割)是一种基于小波变换的高效图像压缩算法。它的核心思想是利用小波系数的自适应排序和阈值处理,优先保留重要的系数,以实现高压缩比的同时保持图像质量。 1. **熵编码**:SPIHT...

    图像压缩SPIHT算法

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)算法是一种高效的无损图像压缩方法,由Sheikh、Said和Wolfe在1996年提出。它是基于小波变换的,尤其适合处理高精度图像,能够保持原始图像的细节和...

    使用VC++实现的SPIHT算法

    2. **级联树结构**:SPIHT算法将图像系数按照一种特殊的级联树结构组织,这个结构允许快速选择重要的系数。这种树形结构基于“显著性”判断,有助于压缩过程中的数据分类。 3. **显著性检测**:SPIHT算法的核心在于...

    SPIHT编解码算法设计.doc

    SPIHT(Set Partitioning in Hierarchical Trees - 层次树集分割)编解码算法是一种高效的小波图像压缩方法,由Said和Pearlman在1996年提出,它是Embedded Zero Tree Wavelet(EZW)算法的优化版本。SPIHT算法的主要...

    基于小波的SPIHT编码matlab程序

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)编码是一种高效的小波图像压缩算法,由Sheikh、Simoncelli和Bovik在1996年提出。它利用小波变换将图像数据分解成多个分辨率级别的细节和粗略信息,...

    SPIHT算法的软件实现

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)算法是一种高效的图像压缩算法,主要用于无损或近无损的数据压缩。该算法由Sheikholeslam、Fattal和Rabbani在1996年提出,是基于小波变换的熵编码...

    spiht算法的matlab实现

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种高效的离散小波变换编码方法,尤其适用于图像压缩。MATLAB是广泛应用于数值计算和信号处理的编程环境,非常适合用来实现SPIHT算法。以下是...

    SPIHT压缩算法Matlab实现源代码

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)压缩算法是一种基于小波变换的无损图像压缩技术,由Shechtman、Bove和Alpert在1996年提出。它利用小波分析对图像进行多分辨率表示,并通过自适应熵...

    matlab开发-SPIHT算法图像压缩

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种基于小波变换的无损图像压缩方法,由Mallat和Zhang在1993年提出。在MATLAB环境中开发SPIHT算法,可以充分利用其强大的数学计算能力和图形...

    在matlab中实现了对SPIHT算法的编写_实现了对SPIHT算法的编写_在matlab中_

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种高效的无损图像压缩方法,由Maleki和Donoho在1997年提出。它基于小波变换和熵编码,尤其适用于高精度图像和医疗图像的压缩。在MATLAB中...

    spiht算法的MATLAB源代码

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种高效、无损的图像压缩技术,尤其在医疗成像、遥感和高质量图像存储等领域有广泛应用。MATLAB作为一款强大的数学计算和仿真软件,是实现...

    SPIHT 算法原始程序

    SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)算法是一种高效、高压缩比的图像压缩标准,尤其适用于医学成像和遥感等领域。该算法基于小波变换,利用了图像数据的统计自适应特性,能够在保持较高...

    spiht 算法的实现

    SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种高效的图像压缩方法,主要用于无损或近无损的数据压缩。该算法基于小波变换,由Sheila K. Natarajan在1993年提出。SPIHT算法在保持图像...

Global site tag (gtag.js) - Google Analytics