基于LBG的矢量量化图像压缩编码实验.docx
《基于LBG的矢量量化图像压缩编码实验.docx》由会员分享,可在线阅读,更多相关《基于LBG的矢量量化图像压缩编码实验.docx(12页珍藏版)》请在冰豆网上搜索。
基于LBG的矢量量化图像压缩编码实验
基于LBG的矢量量化图像压缩编码实验
一、实验原理
矢量量化:
要想得到好的性能编码,仅采用标量量化是不可能的。
当把多个信源符号联合起来形成多维矢量,再对矢量进行标量量化时自由度将更大,同样的失真下,量化基数可进一步减少,码率可进一步压缩。
这种量化叫矢量量化。
应用:
在航天、军事、气象、医学、多媒体等领域中经常需要大量存储和传输各种静态图像和视频图像。
为了提高传输效率和减少存储空间,必须采取有效的压缩编码算法消除图像中所包含的各种冗余信息并在给定的失真条件下使用尽量少的比特数来描述图像。
矢量量化(VQ)作为一种有效的有损压缩技术,其突出优点是压缩比大以及解码算法简单,因此它已经成为图像压缩编码的重要技术之一。
矢量量化压缩技术的应用领域非常广阔,如军事部门和气象部门的卫星(或航天飞机)遥感照片的压缩编码和实时传输、雷达图像和军用地图的存储与传输、数字电视和DVD的视频压缩、医学图像的压缩与存储、网络化测试数据的压缩和传输、语音编码、图像识别和语音识别等等。
LGB算法:
一种有效和直观的矢量量化码书设计算法——LBG算法(也叫GLA算法)是由Linde、Buzo和Gray于1980年首先提出来的。
该算法基于最佳矢量量化器设计的最佳划分和最佳码书这两个必要条件,且是Lloyd算法在矢量空间的推广,其特点为物理概念清晰、算法理论严密及算法实现容易。
设训练矢量集为
,待产生的码书为
,其中
,
,
,则码书设计过程就是需求把训练矢量集
分成
个子集
的一种最佳聚类方案,而子集
的质心矢量
作为码字。
假设平方误差测度用来表征训练矢量
和码字
之间的失真,即:
则码书设计的准则可用下列数学形式表达:
最小化
约束条件
,
其中
为
矩阵,其元素满足:
矩阵
可看作训练矢量的聚类结果。
根据
,可计算码字:
其中
代表子集
中训练矢量的数目,或者说是矩阵
第
行
中非零元素的数目。
针对训练矢量集为
,其LBG算法的具体步骤如下:
步骤1:
给定初始码书
,令迭代次数
,平均失真
,给定相对误差门限
。
步骤2:
用码书
中的各码字作为质心,根据最佳划分原则把训练矢量集
划分为
个胞腔
,
满足
步骤3:
计算平均失真
判断相对误差是否满足
若满足,则停止算法,码书
就是所求的码书。
否则,转步骤4。
步骤4:
根据最佳码书条件,计算各胞腔的质心,即
由这
个新质心
形成新码书
,置
,转步骤2。
二、实验目的
采用矢量量化算法(LBG)获得图像压缩所需要的码书,通过码书实现图像压缩编码。
三、实验内容
对给定的一幅图片
四、实验步骤
(1)对训练图片,采用LBG算法获取最佳码书设计;
(2)采用熵编码实现图像索引编号的压缩。
五、程序代码
clearall;
data=imread('cameraman.tif');%调入原始图像
data=double(data)/255;%归一化
[m,n]=size(data);%求出图像的行数和列数
figure
(1)
subplot(1,2,1);
imshow(data);%显示原始图像
title('原始图像')
subplot(1,2,2);
imhist(data);
title('直方图')
siz_word=4;%设置码字的大小
siz_book=512;%设置码书的大小
data1=zeros(m*n,1);
fori=1:
m
forj=1:
n
data1((i-1)*n+j)=data(i,j);
end
end
M1=floor(m*n/siz_word);
r=mod(m*n,siz_word);
ifr>0
M1=M1+1;
end
data2=zeros(M1,siz_word);
l=1;
A=zeros(siz_word,1);
r=1;
fori=1:
m*n
A(r)=data1(i);
ifr==siz_word
data2(l,:
)=A;
l=l+1;
r=1;
else
r=r+1;
end
end
code_book=zeros(siz_book,siz_word);
%LBG算法开始
%初始化码书
l=1;
r=1;
A=zeros(siz_word,1);
fori=1:
siz_book*siz_word
A(r)=data1(i);
ifr==siz_word
code_book(l,:
)=A;
l=l+1;
r=1;
else
r=r+1;
end
end
MIU=zeros(M1,siz_book);
t=1;
whilet==1
fori=1:
M1
B=zeros(siz_word,1);
B=data2(i,:
);
A=zeros(siz_word,1);
A=code_book(1,:
);
tep=0.0;
forl=1:
siz_word
tep=tep+(A(l)-B(l))^2;
end
r=1;
forj=2:
siz_book
A=code_book(j,:
);
temp=sum((A-B).^2);
iftempr=j;
tep=temp;
end
end
MIU(i,r)=1.0;
end
t=0;
code_book1=zeros(siz_book,siz_word);
forj=1:
siz_book
forl=1:
siz_word
tep=0.0;
fori=1:
M1
code_book1(j,l)=code_book1(j,l)+MIU(i,j)*data2(i,l);
tep=tep+MIU(i,j);
end
iftep>0
code_book1(j,l)=code_book1(j,l)/tep;
else
code_book1(j,l)=0.0;
end
end
end
tep=0.0;
forj=1:
siz_book
forl=1:
siz_word
tep=tep+(code_book1(j,l)-code_book(j,l))^2;
end
end
iftep/siz_book<0.000001
t=0;
end
code_book=code_book1;
end
%编码后图像恢复过程
data3=zeros(M1,siz_word);
fori=1:
M1
forj=1:
siz_book
ifMIU(i,j)==1
t=j;
end
end
data3(i,:
)=code_book(t,:
);
end
data5=zeros(m,n);
fori=1:
m
forj=1:
n
tep=(i-1)*n+j;
i1=floor(tep/siz_word);
ifi1==0
i1=1;
end
j1=mod(tep,siz_word);
ifj1==0
j1=siz_word;
end
data5(i,j)=floor(data3(i1,j1)*255);
end
end
figure
(2)
imshow(uint8(data5));%显示恢复图像
title('矢量量化编码后恢复的图像')
六、运行结果
siz_book=512
当把码书的大小改为siz_book=256时,图片明显比码书为512时模糊,因为此时所分的区间更大,导致图片解码时不精确度加大
siz_book=256
然而当siz_book=1024时,与siz_book=512时的矢量量化后的图片变换很小,很难用眼睛区分开来,这说明影响图片质量的主要因素不是码书的大小了,而是码字的大小,或者其他的因素,导致图片解码后的不够清晰。
同时码字的大小也对矢量量化编码的影响较大,当码字比小时,图片的轮廓更加清晰,而码字变大时,图片编码后更加模糊。