现在我们讨论SPIHT算法的解码过程。SPIHT的编码输出包括:初始阈值T,排序扫描位流SnList,精细扫描位流 RnList,初始有序表(LSP、LIP、LIS、LisFlag),这些参数就作为SPIHT解码的输入,另外还有解码级数decodeDim。
前面我们提到,任何排序算法的执行路径都是使用分支点的比较结果进行定义的。如果解码器和编码器使用相同的排序算法,则对于编码器输入的系数比较结果,解码器通过执行相同的路径就可获得排序信息。所以,只需将编码器数学表述中的“输出”改为“输入”,解码器即可恢复数据的排序信息;在恢复数据排序信息的同时,解码器还要负责图像的重构,对于确认恢复的重要系数,通过排序扫描和精细扫描两个步骤更新系数的量化值,逐步提高逼近精度和重构图像的质量。
1、首先给出解码主程序
function DecodeMat=spihtdecoding(T,SnList,RnList,ini_LSP,ini_LIP,ini_LIS,ini_LisFlag,decodeDim)
% 函数 SPIHTDECODING() 是SPIHT算法的解码主程序
% 输入参数:T —— 初始阈值,T=2^N,N=floor(log2(max{|c(i,j)|})),c(i,j)为小波系数矩阵的元素
% SnList —— 排序扫描输出位流
% RnList —— 精细扫描输出位流
% ini_L* —— 初始系数(集合)表
% LSP:重要系数表
% LIP:不重要系数表
% LIS:不重要子集表,其中的表项是D型或L型表项的树根点
% LisFlag:LIS中各表项的类型,包括D型和L型两种
% decodeDim —— 解码级数
% 输出参数:DecodeMat —— 解码后重构的小波系数矩阵
%
% 由SPIHT算法原理的排序特点,解码器的执行程序与编码器的程序路径基本相同,只需把编码器程序中的
% 输出信息改为输入,稍作修改即可得到解码器的程序代码
global rMat cMat
% rMat、cMat是Mat的行、列数,作为全局变量,在编码、解码的相关程序中使用
%-------------------------------------------%
% ----- Decoding Input Initialization ----- %
%-------------------------------------------%
N=log2(T);
% 获取初始阈值的指数-N
DecodeMat=2^(N-decodeDim)*rand(rMat,cMat);
% 初始化重构矩阵为一个随机矩阵,其元素最大值小于最高级解码阈值的二分之一
% 这样就可以保证未被扫描赋值的区域有一定的灰度,避免重构图像出现色块
LSP=ini_LSP;
LIP=ini_LIP;
LIS=ini_LIS;
LisFlag=ini_LisFlag;
% 将输入的各项列表存入相应的解码工作列表
%---------------------------%
% ----- Decoding Loop ----- %
%---------------------------%
for d=1:decodeDim
%-------------------------------------%
% ----- Decoding Initialization ----- %
%-------------------------------------%
[Sn,SnList]=getflow(SnList);
[Rn,RnList]=getflow(RnList);
% 用 GETFLOW() 函数读取本级解码所需的位流信息
LSP_Old=LSP;
% 列表LSP_Old用于存储上级解码产生的重要系数列表LSP,作为本级精细解码的输入
%--------------------------%
% ----- Sorting Pass ----- %
%--------------------------%
% ----- LIP Scan ----- %
%----------------------%
[DecodeMat,Sn,LSP,LIP]=lip_decode(DecodeMat,Sn,N,LSP,LIP);
%----------------------%
% ----- LIS Scan ----- %
%----------------------%
[LSP,LIP,LIS,LisFlag,DecodeMat,N]=lis_decode(DecodeMat,N,Sn,LSP,LIP,LIS,LisFlag);
%-----------------------------%
% ----- Refinement Pass ----- %
%-----------------------------%
DecodeMat=decRefine(DecodeMat,Rn,N+1,LSP_Old);
end
可以看出,解码程序和编码程序几乎是一样的,执行路径也相同。只不过解码器要对输入的扫描位流SnList、RnList进行分段读取,只读入本级解码所需的位流,下面给出位流信息读取程序:
(1)位流信息读取程序
function [flow,bitflow]=getflow(bitflow)
% 函数 GETFLOW() 用于截取本级解码所需的位流信息
% 输入参数:bitflow —— 初始为编码器的输入位流,在解码过程中为上一级解码截取后剩余的编码位流
% 输出参数:flow —— 本级解码所需的位流(排序位流Sn、精细位流Rn)
% bitflow —— 本级解码截取后剩余的编码位流
flow=[];
i=1;
while bitflow(i)~=7
flow(i)=bitflow(i);
i=i+1;
end
% 数字‘7’作为位流区别符,区分不同编码级的位流
bitflow(1:i)=[];
% 将对应于本级解码位流的 bitflow 数据清空
% bitflow 被完全清空后返回一个空表值
if isempty(bitflow)
bitflow=[];
end
分享到:
相关推荐
### SPIHT算法详解及其Matlab实现 #### 一、SPIHT算法概述 ##### 1.1 SPIHT算法与EZW算法的区别 SPIHT (Set Partitioning in Hierarchical Trees) 算法是一种高效的图像编码技术,它基于多级树集合分裂的思想。与...
为了在图像轮廓处获得更好的压缩效采,在多级树集合分裂( SPIHT)算法的基础上提出了一种优先编码周围邻域中重要系数较多的系数与集合的小波图像压缩算法。在编码之前对系数或集合按照周围重要系数的个数进行排序,...
在MATLAB中实现SPIHT算法,需要编写小波变换、系数排序、树结构构建、筛选和熵编码等模块。代码通常包括预处理、小波分解、显著性检测、编码和后处理等步骤。通过对MATLAB代码的理解和调试,可以更好地掌握SPIHT...
通过以上介绍,我们可以看到SPIHT算法的MATLAB实现涉及到小波变换、树结构编码和解码等多个方面,是一套完整的图像压缩解决方案。对于希望深入了解和应用SPIHT算法的人来说,这个MATLAB实现提供了宝贵的参考。
总的来说,MATLAB开发的SPIHT算法图像压缩程序能够实现高效且高质量的图像压缩,适用于各种需要高图像质量的应用,包括游戏开发。通过深入理解DWT、显著性传播和熵编码等原理,并结合MATLAB的工具和函数,开发者可以...
SPIHT(Set Partitioning In Hierarchical Trees,分层树集划分)算法是一种高效、无损的图像压缩技术,尤其在医疗成像、遥感和高质量图像存储等领域有广泛应用。MATLAB作为一款强大的数学计算和仿真软件,是实现...
SPIHT(Set Partitioning in Hierarchical Trees,分层树中的集合划分)是一种高效的图像压缩算法,主要用于无损或近无损的数据压缩。该算法由Sheikholeslam、Fattal和Rabbani在1996年提出,是基于小波变换的熵编码...
对于想要学习和使用SPIHT算法的MATLAB用户,可以从提供的"SPIHT"压缩包文件中找到源代码,通过阅读和运行代码,深入理解算法的实现过程,进而应用于自己的项目中。同时,为了优化性能和适应不同需求,可能需要对源...
总之,这个压缩包提供了一个完整的SPIHT算法实现,包括编码和解码过程,对于想要学习和理解SPIHT算法的初学者,是一份非常宝贵的资源。通过阅读代码、文档和实验,可以深入掌握SPIHT算法的工作原理,以及如何在Linux...
在MATLAB中实现SPIHT算法,需要编写小波变换和逆变换的代码,以及实现显著性检测、树结构构建和编码解码的逻辑。`SPIHT_Matlab_Demo`可能包含用于演示SPIHT算法的MATLAB脚本和函数,用户可以通过运行这个示例程序来...
在这个项目中,MATLAB被用来实现SPIHT压缩算法的编码和解码过程。源代码包括以下几个关键函数: 1. `func_SPIHT_Demo_Main.m`:这是主程序,调用其他函数进行SPIHT压缩和解压的演示。用户可以通过运行这个脚本来...
- `progcode` 和 `progdecd` 可能是完整的程序代码,包含了SPIHT算法的完整实现。 - `test` 文件可能包含了一些测试用例,用于验证算法的正确性和性能。 对于初学者,这些文件提供了很好的学习资源,通过阅读和理解...
7. **MATLAB实现**:在MATLAB环境中,实现SPIHT算法通常包括定义小波基,进行小波变换,执行显著性检测,构建和更新上下文模型,熵编码和解码,以及逆小波变换的过程。需要注意的是,MATLAB提供了丰富的工具箱支持小...
SPIHT,全称为Set Partitioning in Hierarchical Trees,即多级树集合分裂算法,是一种用于图像压缩的无损编码方法。它由Mallat和Zibulevsky在1990年代中期提出,主要用于高分辨率、高精度图像的压缩,特别是在医学...
SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)算法是一种高效的图像压缩方法,由Mallat和Zhang于1993年提出。该算法基于小波变换,利用图像的自相似性和边缘特性,实现了高压缩比的同时保持了较高...
**SPIHT算法详解** SPIHT(Set Partitioning in Hierarchical Trees,层次树集划分)算法是一种基于小波变换的无损图像压缩算法,由Mallat和Zibulski在1993年提出。该算法以其高效、精确的编码性能在图像压缩领域...
SPIHT(Set Partitioning in Hierarchical Trees,分层树集划分)是一种用于图像压缩的算法,它基于小波变换。SPIHT算法以其高效、高压缩率和良好的图像重构质量而闻名,尤其适用于医学图像和遥感图像的压缩。在本...
CSDN Matlab武动乾坤上传的资料均有对应的代码,代码均可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行...