现在我们分别用一幅16*16的Lena局部图像和一幅64*64的Girl局部图像来查看SPIHT算法的编码过程和解码效果。
1、编码过程演示
这里我们使用的源图像是一幅16*16的Lena眼睛局部图像,其源图像和3级小波分解如下图所示:
图1
3级分解的小波系数矩阵为:
利用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级解码后重构的小波系数矩阵
可以看到,3级解码后重构的小波系数矩阵大部分区域都是未被扫描赋值的随机数,所以要进行更高级的编码和解码,才能获得高质量的重构图像。
对源图像再进行7级编码和7级解码,我们看一下图像重构效果如何:
RecImMat = % 7级解码后重构的小波系数矩阵
可见,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
最后,我们再看看对普通的256*256图像,程序运行效果如何。同样是3级小波分解、7级编码、7级解码。
Runtime = 484.8125