多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示

时间:2022-12-12 07:40:35

现在我们分别用一幅16*16的Lena局部图像和一幅64*64的Girl局部图像来查看SPIHT算法的编码过程和解码效果。


1、编码过程演示
    这里我们使用的源图像是一幅16*16的Lena眼睛局部图像,其源图像和3级小波分解如下图所示:

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示图1
    3级分解的小波系数矩阵为:

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示 


    利用SPIHT编码算法对图像进行3级编码和3级解码后,输出如下结果:

N =     7            % 初始阈值指数
T =   128            % 初始阈值

ini_LSP =     []       % 初始重要系数列表

ini_LIP =                % 初始不重要系数列表
     1     1
     1     2
     2     1
     2     2
     1     3
     1     4
     2     3
     2     4
     3     1
     3     2
     4     1
     4     2
     3     3
     3     4
     4     3
     4     4

ini_LIS =                % 初始不重要子集列表
     1     3
     1     4
     2     3
     2     4
     3     1
     3     2
     4     1
     4     2
     3     3
     3     4
     4     3
     4     4

ini_LisFlag =    DDDDDDDDDDDD        %初始不重要子集列表中各表项的类型

codeLevel =     1            % 第一级编码
Threshold =   128           % 第一级编码的阈值
SnL =                           % 第一级编码输出的排序扫描位流和精细扫描位流
0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7
RnL =
7

codeLevel =     2            % 第二级编码
Threshold =    64           % 第二级编码的阈值
SnL =                           % 第二级编码输出的排序扫描位流和精细扫描位流
0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7
RnL =
7  0  7

codeLevel =     3            % 第三级编码
Threshold =    32            % 第三级编码的阈值
SnL =                            % 第三级编码输出的排序扫描位流和精细扫描位流
0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  1  1  0  0  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  1  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  1  1  1  0  0  0  1  0  0  0  1  0  0  0  0  1  0  0  0  1  0  1  0  0  1  0  0  0  0  0  7
RnL =
7  0  7  0  0  1  7


RecImMat =            % 3级解码后重构的小波系数矩阵
多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示 

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示

 
    可以看到,3级解码后重构的小波系数矩阵大部分区域都是未被扫描赋值的随机数,所以要进行更高级的编码和解码,才能获得高质量的重构图像。
    对源图像再进行7级编码和7级解码,我们看一下图像重构效果如何:

RecImMat =            % 7级解码后重构的小波系数矩阵
多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示

    可见,7级解码后系数矩阵大部分元素都被扫描赋值了,只剩下一个2*2的区域低于解码阈值而未被扫描,但由于初始的重构矩阵是一个元素最大值小于*解码阈值的二分之一的随机矩阵,这就保证了重构图像尽可能平滑地恢复,而不会出现区域色块。
    
2、运行时间
    下面,我们通过一幅64*64的Girl图像来看看程序的运行时间和重构效果。
    图像分解级数:3
    SPIHT编码级数:7
    SPIHT解码级数:7

(1)主程序代码如下:

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

global rMat cMat
strtime=cputime;
[rMat,cMat]=size(Im);
% ----- Image Wavedec ----- %
DecIm=mywavedec2(Im,imDim);
       

% ----- SPIHT Coding ----- %
[T,SnList,RnList,ini_LSP,ini_LIP,ini_LIS,ini_LisFlag]=spihtcoding(DecIm,imDim,codeDim);

% ----- SPIHT Decoding ----- %
DecodeMat=spihtdecoding(T,SnList,RnList,ini_LSP,ini_LIP,ini_LIS,ini_LisFlag,decodeDim);
% ----- Waverec -----%
m=2^imDim;
DecImLL=DecIm(1:rMat/m,1:cMat/m)
DecodeLL=DecodeMat(1:rMat/m,1:cMat/m)
% 显示小波分解系数矩阵和重构系数矩阵在LL_N分解级的数据,比较重构效果
RecIm=mywaverec2(DecodeMat,imDim,decodeDim);
Runtime=cputime-strtime

(2)小波分解系数矩阵和重构系数矩阵的LL_N分解级的数据,比较重构效果



DecImLL =
   67.0625  106.3750  117.5625  130.3125  110.0000   75.6875   82.6875   65.6250
   61.5000   50.7500   61.9375  127.0000  104.6875   67.8125   43.2500   36.8750
   69.3750  117.4375  121.5625  146.7500  123.0625  123.4375   90.9375   92.1250
   76.9375  153.5000  151.0625  143.3750  111.2500  150.3125  143.3750  124.8125
   69.8750  135.8750  117.9375  106.4375   85.8750  133.1250  138.6875  116.5625
   54.2500   94.8750   99.2500  117.9375  118.1250  104.3125  102.0625   88.2500
   56.2500   75.5625  126.6875  129.4375  119.9375   89.8750  112.0625   83.2500
   74.5000   45.7500  101.3125  133.0000  124.8125  116.1875  105.0000   77.0000

DecodeLL =
    67   107   117   131   111    75    83    65
    61    51    61   127   105    67    43    37
    69   117   121   147   123   123    91    93
    77   153   151   143   111   151   143   125
    69   135   117   107    85   133   139   117
    55    95    99   117   119   105   103    89
    57    75   127   129   119    89   113    83
    75    45   101   133   125   117   105    77

(3)运行时间
Runtime =    8.0625

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示
多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示 

最后,我们再看看对普通的256*256图像,程序运行效果如何。同样是3级小波分解、7级编码、7级解码。

Runtime = 484.8125

多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示 
多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(8)实例演示