首先解决方案分成以下三个工程:
trvqsp_img:获得图像矢量量化的码书
vqimg_enc:根据码书对图像进行矢量量化
vqimg_dec:根据码书文件和压缩后的文件重构原始图像
一、调试过程
首先,由于解决方案是VS2012版本的,但是我电脑里只有VS2010,强行打开后发现出现以下问题:
1、显示以下错误:项目文件包含ToolsVersion="12.0"。此工具集可能未知或缺失(您可以通过安装相应版本的 MSBuild 来解决该问题),或者该生成因策略原因已被强制更改为...
解决方法:右键点击项目,选择属性,再点击配置属性中的常规,常规中有个平台工作集,把V120改成V100,点击应用即可。
2、显示unistd.h头文件找不到,是因为安装时就没有这个文件,所以就新建一个unistd.h文件,内容为
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
把这个文件添加到各个项目,并把#include<>改成#include””。
改完以上两点后,可以运行
二、整体流程
整个流程主要分为两三大部分:一个是训练矢量量化器,获得图像压缩码书;一个是根据码书对文件进行压缩;另一个是根据码书对压缩文件进行解压缩,恢复原始文件。
1、trvqsp_img:
流程图:
程序中运行过程:
(1)打开图像文件与码书文件
(2)读取相应参数
(3)把图像存到缓冲区trimg
(4)codebook_size变为之前2倍。对codebook赋值,奇数行不变,偶数行加上一个eps扰动。
(5)measure>门限值且迭代次数小于100次时,迭代codebook行,如果有匹配训练集行,该行赋值为匹配训练集行的均值;如果没有,则该行赋值为上次码书匹配最多行并加扰动;对训练集每一行找到码书中平方差最小的行,累加起来。
(6)重复步骤(5)直到不满足条件
(7)重复(4)-(6)直到codebook_size不再<final_codebook_size
(8)输出码书
2、vqimg_enc:
流程图:
程序中运行过程:
(1)打开文件,读取参数
(2)把打开的文件存入inimg缓冲区
(3)从码书文件读取压缩参数
(4)读取Codebook相关参数,并开一个缓冲区codebook存放码书
(5)对读入文件分块,对每一块找到对应码书,并计算每个块存在的误差distortion(利用vqencode函数)
(6)把码书编号作为内容存放到输出缓冲区,完成输出文件(利用stuffit函数)
(7)把所有误差累加起来计算总的误差total_distortion并输出。
3、vqimg_dec:
流程图:
程序中运行过程:
(1)打开文件,读取参数
(2)把打开的文件存入cbfile缓冲区
(3)开一个缓冲区outimg存放输出文件
(4)读取Codebook相关参数,并开一个缓冲区codebook存放码书
(5)读入文件,找到每一块的内容,也就是码书的编号。将编号对应的codebook中的内容写到outimg缓冲区。作为输出文件。
(6)完成输出文件