【信源编码作业】5. LBG 矢量量化算法

0. 写在开头

嗯…现在是 2017 年 5 月 4 号晚 9 点半,明天早上就是信源编码课了…
所以…
来不及了!赶紧随便粘点东西!

1. LBG 算法介绍

想直接从维基百科粘的…结果竟然没有这个词条!
英文维基内容也超!级!少!
最后找到了 这篇论文,是 LBG 算法最原始的原文了…
作为英文苦手呢,还是引用 **** 上 别人的博客 吧:

LBG算法:
1、给定训练集T。固定ɛ(失真阈值)为一个很小的正数。
2、让N=1(码矢数量),将这一个码矢设置为所有训练样本的平均值:
【信源编码作业】5. LBG 矢量量化算法
计算总失真度(这时候的总失真很明显是最大的):
【信源编码作业】5. LBG 矢量量化算法
3、分裂:对i=1,2,…,N,他们的码矢分别为:
【信源编码作业】5. LBG 矢量量化算法
让N=2N,就是每个码矢分裂(乘以扰乱系数1+ɛ和1-ɛ)为两个,这种每一次分裂后的码矢数量就是前一次的两倍。
4、迭代:让初始失真度为: 【信源编码作业】5. LBG 矢量量化算法。将迭代索引或者迭代计数器置零 i=0.
1)对于训练集T中的每一个训练样本 m=1,2,…,M。在所有码矢中寻找【信源编码作业】5. LBG 矢量量化算法的最小值,也就是看这个训练样本和哪个码矢距离最近。我们用 n * 记录这个最小值的索引。然后用这个码矢来近似这个训练样本:
【信源编码作业】5. LBG 矢量量化算法

2)对于n=1,2,…,N,通过以下方式更新所有码矢:
【信源编码作业】5. LBG 矢量量化算法
也就是将所有属于cn所在的编码区域Sn的训练样本取平均作为这个编码区域的新的码矢。
3)迭代计数器加1:i=i+1.
4)计算在现阶段的C和P基础上的总失真度:
【信源编码作业】5. LBG 矢量量化算法
5)如果失真度相比上一次的失真度(相对失真改进量)还大于可以接受的失真阈值ɛ(如果是小于就表明再进行迭代运算失真得减小是有限的以停止迭代运算了),那么继续迭代,返回步骤1)。
【信源编码作业】5. LBG 矢量量化算法
6)否则最终失真度为【信源编码作业】5. LBG 矢量量化算法 。对n=1,2,…,N,最终码矢为:【信源编码作业】5. LBG 矢量量化算法
5、重复步骤3和4至到码矢的数目达到要求的个数。

是不是很丑!因为来不及改格式了!
再说明一遍——这一段来自原文:http://blog.****.net/zouxy09/article/details/9153255
要看漂亮的原文的可以点上面的链接!!

2. 代码解析

老师给的代码中一共有三个项目:trvqsp_img、vqimg_enc、vqimg_enc,分别作用如下:

  • trvqsp_img: 根据输入图像得到码书;
  • vqimg_enc: 根据码书对图像进行矢量量化;
  • vqimg_dec: 根据码书文件和压缩后的文件重构原始图像。

下面分别解释这三个代码:

trvqsp_img

【信源编码作业】5. LBG 矢量量化算法
老师给的流程图
【信源编码作业】5. LBG 矢量量化算法
证明我调过代码

vqimg_enc

【信源编码作业】5. LBG 矢量量化算法

vqimg_dec

【信源编码作业】5. LBG 矢量量化算法

3. 结语

为什么后两个代码没有详细流程图呢——因为我没时间整理啊!不过也比较简单,不需要这么详细了(呸!
最后放一张结果图(也是老师给的!):

【信源编码作业】5. LBG 矢量量化算法

总之就是编码大成功!码书越大、块越小,效果越好!