第四次作业 LBG矢量量化算法
自从1980年提出矢量量化器码书设计的LBG算法以来,矢量量化技术已经成功地应用到图像压缩和语音编码中。
LBG算法中的最佳矢量量化器设计的关键是最佳划分和最佳码书的设计。 一是给定码书条件下寻找信源空间的最佳划分,使平均失真最小,由码书 和NNR得最佳划分,信源空间中的任一点矢量,如果它和码字的失真小于它和其它码字的失真;二是在给定划分条件下,寻找最佳码书,使平均失真最小。其思想如下所示:
(1)随意选取n个图像块作为码字;
(2)由这n个码字对所有的图像块进行划分,即分成n个集合,使每个集合中的图像块,都是与各码字距离中与对应的码字的距离最小的;
(3)由这n个集合的重心,得到n个新的码字;
(4)如果这些个码字与原来的码矢量变化不大(收敛),就完成码书的训练,否则重新进行2、3步。
算法步骤如下所示:
(1)给定训练集T。固定ɛ(失真阈值)为一个很小的正数;
(2)让N=1(码矢数量),将这一个码矢设置为所有训练样本的平均值:
计算总失真度(这时候的总失真很明显是最大的):
(3)分裂:对i=1,2,…,N,他们的码矢分别为:
让N=2N,就是每个码矢分裂(乘以扰乱系数1+ɛ和1-ɛ)为两个,这种每一次分裂后的码矢数量就是前一次的两倍。
(4)迭代:让初始失真度为: 。将迭代索引或者迭代计数器置零i=0.
1)对于训练集T中的每一个训练样本m=1,2,…,M。在所有码矢中寻找的最小值,也就是看这个训练样本和哪个码矢距离最近。我们用n*记录这个最小值的索引。然后用这个码矢来近似这个训练样本:
。
2)对于n=1,2,…,N,通过以下方式更新所有码矢:
也就是将所有属于cn所在的编码区域Sn的训练样本取平均作为这个编码区域的新的码矢。
3)迭代计数器加1:i=i+1.
4)计算在现阶段的C和P基础上的总失真度:
5)如果失真度相比上一次的失真度(相对失真改进量)还大于可以接受的失真阈值ɛ(如果是小于就表明再进行迭代运算失真得减小是有限的以停止迭代运算了),那么继续迭代,返回步骤1)。
6)否则最终失真度为 。对n=1,2,…,N,最终码矢为:
(5)重复步骤3和4至到码矢的数目达到要求的个数。
LBG算法有3个主要缺点:
(1)在每次迭代的最佳划分阶段从码书中搜索训练矢量的最近码字需要大量的存储空间和繁琐的计算;
(2)初始码书的选择影响码书训练的收敛速度和最终码书的性能;
(3)码书的自适应能力不强。
二、程序调试
系统:win7
软件:vs2010
打开程序包项目,进行重新编译及重定项目目标后,运行程序,报错:无法找到unistd.h,
经查询解决方法为:
新建unistd.h文件,文件内容为:
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
并将unistd.h文件置于如下路径文件夹中
一、 trvqsp_img:获得图像矢量量化的码书。
这个程序可以用来训练矢量量化器。使用LBG算法获得图像压缩码书,初始化使用Linde, Buzo, and Gray提出的分割方法。用作。这个项目可以 很长一段时间来运行特别是所需的大小 码书很大。因此这是一个好主意来运行 项目背景。
图像的尺寸可以由用户指定或者由程序直接获得。但是image_size只支持少量的图像标准,如果想要支持更多格式的文件需通过编辑文件image_size.c来实现。或者可以在运行时指定图像的尺寸(使用选项- x – y)。
1. 调用参数格式:
trvqsp_img ts_img codefile [-b cb_size] [ -t block_height] [-w block_width] [-x row_size][-y col_size] [-h]
ts_img:是训练图像,也即待量化压缩的图像,假定为8位灰度级,使用光栅扫描顺序存储。
Codefile:以二进制格式存放码书的文件,有一个包含12个字节的文件头记录:向量的维度,以及码书的大小。
-b cb_size:码书的大小
-t block_height:块的高度(以像素为单位)
-w block_width:块的宽度(以像素为单位)
实际上由block_width 、block_height决定着码书向量的大小,也即每个输出块的大小。因此向量的维数是block_height *block_width。
-x row_size:输入图像的宽
-y col_size:输入图像的高
-h 帮助
2. 码书构造流程
二、 vqimg_enc:根据码书对图像进行矢量量化。
这个程序可以使用矢量量化来压缩图像。需使用trvqsp_img获得的码书文件,码书的大小以及码块的大小包含在指定的码书文件中。这个程序使用的是定长编码,所以可以使用变长编码来优化程序。如果没有指定一个输出文件则从命令框中输出。
1. 调用格式:
vqimg_enc [-i imagein] [-o cmpfile] [-c codebook] [-x row_size] [-y col_size] [-h]
-i imagein:输入的待编码的图像文件名
-o cmpfile:输出的量化压缩后的文件名
-c cmpfile:码书文件
-x row_size:输入图像的宽
-y col_size:输入图像的高
2. 量化流程:
三、 vqimg_dec:根据码书文件和压缩后的文件重构原始图像。
重建压缩图像使用vqimg_enc。解码需要提供码书文件,而码书文件则通过压缩文件的文件头提供其名称,不需要人为输入。图像是8位灰度级图像,使用光栅扫描顺序存储。
1. 调用格式:
vqimg_dec [-i cmpfile] [-o imageout] [-h]
-i cmpfile:压缩文件名
-o imageout:重建图像文件名
-h 帮助
2. 重构流程