for(int i=0;i<N;i++)
{ for(int j=0;j<tv.M;j++)
{if(s[j]==i) n++;
yn[i]=n;
} }dsum=0;
for(int i=0;i<tv.M;i++)
{dsum=dsum+(long)min1(tv.train[i],1);
}d1=(double)(dsum/tv.M);
d=Math.abs(((double)(d0-d1)/(double)d1));
if(d1<d0&&d>e)
{for(int i=0;i<N;i++)
{if(yn[i]!=0)
{o=core(tv,i,s);
codebook[i].vcopy(o);
}d0=d1;
flag=1;
}while(flag==1);
在这段代码中,首先建立码本与训练矢量的关系,并经过多次的劳埃德迭代直到满足门限条件,生成新的码书。这里应用了LBG算法他具有如下的优点:
1.不用初始化计算,可大大减少计算时间
2.初始码字选自训练序列,无空胞腔问题
虽然LBG算法有如上的优点,但是他本身也存在一些缺点和不足的地方,比如在计算的过程中可能会选到一些非典型矢量作码字,因而该胞腔中只有很少矢量,甚至只有一个初始码字,而且每次迭代又都保留了这些非典型矢量的形心;还可能会造成在某些空间把胞腔分得过细,而有些空间分得太大。这些缺点都会导致码书中有限个码字得不到充分利用,还需要进一步的改进算法。
程序整体流程图如图4.3所示:
图4.3 软件流程图
4.2.3 矢量量化码字索引与恢复
在这个程序中没有考虑快速码字搜索的算法,应用了最佳码字搜索的方法,使输入矢量与所有的码字进行比较,选出距离最小的那个码字成为匹配码字,生成索引。这种算法虽然增加了计算量,但是减少了图像数据压缩过程中的失真。
在输出端,将编码过后生成的索引对照码书,将图像数据进行还原。
4.3 实验结果及评价
在初始界面点击浏览按钮调入.BMP图像。图像就会显示在程序运行初始界面的左侧,如图4.3所示:
图4.4 压缩前的程序界面
点击”压缩”按钮,程序就会自动进行矢量量化的压缩,下面的进度条会显示压缩的百分比,当进度达到100%时,程序就会将解压好的图像显示在程序界面的左侧。并显示一系列的压缩信息,包括压缩源文件的大小,压缩后的码本大小,压缩比,压缩过程所需要的时间以及峰信噪比PSNR等信息。压缩后的界面如图4.5所示:
图4.5 恢复后的程序界面
程序显示的压缩结果的压缩比和压缩时间上可以看出,这个利用矢量量化编码算法的压缩软件可以达到16:1的高压缩比,并且压缩时间比较短。所以矢量量化压缩编码是一种非常有效的压缩算法。
从压缩图像的效果来看,实验测试的图像均采用的512×512,8比特/象素的women图像作为训练图像产生各种大小的码书,矢量维数均为16,对压缩程序进行测试。通过变换码书的大小,运行程序得到不同的信噪比。测试结果如下表4.1所示:
表4.1 不同码书的信噪比
序号 码书大小 PSNR
1 64 27.36
2 128 27.74
3 256 28.54
4 512 29.28
如上表所示,随着码书的加大,系统的信噪比在升高,当码书大小为512时,PSNR可以达到29.28。图像虽然有一定程度上的失真,但是并不是十分明显,基本上保持了图像原有的图像质量。
这个程序采用的是矢量量化码书生成算法中的LBG算法,通过运行程序以及对运行结果的分析可以看出这种从标量量化劳埃德迭代操作推广出来的迭代算法具有以下两个优点:
1.不用初始化计算,可大大减少计算时间
2.初始码字选自训练序列,无空胞腔问题
虽然LBG算法在具有如上的优点,但是因为LBG算法是一种下降算法,每次迭代总能减少(至少保持不变)平均失真,而且每次迭代通常只能产生码书的局部变化,即每次迭代后,与旧码书相比,新码书不可能有非常大的变化。所以初始码书的选择影响码书训练的收敛速度和最终码书的性能,一旦选定初始码书,该算法只能得到局部最优的码书,即LBG算法一般不能得到全局最优的码书。
在每次迭代的最佳划分阶段,从码书中搜索训练矢量的最近码字需要大量的存储空间和繁琐的计算;这对软件大的运行要求比较高的运行环境。这个可以通过快速码字搜索的算法来解决这个问题。