基于 LBG 的矢量量化图像压缩编码实验
一、实验原理
矢量量化:
要想得到好的性能编码,仅采用标量量化是不可能的。当把多个信源符号
联合起来形成多维矢量,再对矢量进行标量量化时自由度将更大,同样的失真下,
量化基数可进一步减少,码率可进一步压缩。这种量化叫矢量量化。
应用:
在航天、军事、气象、医学、多媒体等领域中经常需要大量存储和传输各
种静态图像和视频图像。为了提高传输效率和减少存储空间,必须采取有效的压
缩编码算法消除图像中所包含的各种冗余信息并在给定的失真条件下使用尽量
少的比特数来描述图像。矢量量化(VQ)作为一种有效的有损压缩技术,其突出优
点是压缩比大以及解码算法简单,因此它已经成为图像压缩编码的重要技术之
一。矢量量化压缩技术的应用领域非常广阔,如军事部门和气象部门的卫星(或
航天飞机)遥感照片的压缩编码和实时传输、雷达图像和军用地图的存储与传输、
数字电视和 DVD 的视频压缩、医学图像的压缩与存储、网络化测试数据的压缩
和传输、语音编码、图像识别和语音识别等等。
LGB 算法:
一种有效和直观的矢量量化码书设计算法——LBG 算法(也叫 GLA 算法)是
由 Linde、Buzo 和 Gray 于 1980 年首先提出来的。该算法基于最佳矢量量化器设
计的最佳划分和最佳码书这两个必要条件,且是 Lloyd 算法在矢量空间的推广,
其特点为物理概念清晰、算法理论严密及算法实现容易。
设训练矢量集为
X
其中
x
i
x
,
x
1
i
,
,
x
(
ki
i
0
,
xx
1
0
)1
,
y
j
,
,
Mx
,
y
0
j
1
y
j
,
Ny
Nj
1
1
,
,
,待产生的码书为
y
C
,
y
1
,
0
,
,
y
(
kj
1
)1
,
0
Mi
0,1
则码书设计过程就是需求把训练矢量集 X 分成 N 个子集
S j
(
j
,1,0
,
N
)1
的
一种最佳聚类方案,而子集 jS 的质心矢量 jy 作为码字。假设平方误差测度用来
表征训练矢量 ix 和码字 jy 之间的失真,即:
(
,
yxd
i
j
)
k
1
l
0
(
x
il
y
2)
jl
则码书设计的准则可用下列数学形式表达:
最小化
约束条件
(
CXWf
,
,
)
1
1
N
M
j
0
i
0
,
yxdw
ij
(
i
)
j
1
N
j
0
ijw
1
,
0
Mi
1
其中W 为
NM 矩阵,其元素满足:
S
S
ijw
x
x
1
0
i
i
j
j
矩阵W 可看作训练矢量的聚类结果。根据W ,可计算码字:
y
j
1
1 M
S
0
i
j
xw
ij
i
其 中 jS 代 表 子 集 jS 中 训 练 矢 量 的 数 目 , 或 者 说 是 矩 阵 W 第 1j 行
(
,
iwij
,1,0
,
M
)1
针对训练矢量集为
X
中非零元素的数目。
1
)0(
y
1
y
,
xx
1
0
Mx
)0(
0
C
)0(
,
,
,
,
)1(D
,给定相对误差门限
0(
步骤 1:给定初始码书
,
,令迭代次数 0n ,平均失真
,其 LBG 算法的具体步骤如下:
1
)0(
Ny
)1
。
S
n
1
N
)(
Xv
步骤 2:用码书 )(nC 中的各码字作为质心,根据最佳划分原则把训练矢量集
X 划分为 N 个胞腔
)(
n
S
)(
n
0
,
S
)(
n
1
,
,
, )(n
iS 满足
S
)(
n
i
|
,(
yvdv
)(
n
i
)
0
,(
yvd
)(
n
j
),
S
min
1
Nj
步骤 3:计算平均失真
)(
n
D
1
1 M
M
0
i
min
1
Nj
0
(
,
yxd
i
)(
n
j
)
判断相对误差是否满足
(
D
(
n
)1
D
)(
n
/)
D
)(
n
若满足,则停止算法,码书 )(nC 就是所求的码书。否则,转步骤 4。
步骤 4:根据最佳码书条件,计算各胞腔的质心,即
y
(
i
n
)1
1
)(
n
i
S
(
iSv
v
n
)
由这 N 个新质心
(
y n
i
,)1
i
,1,0
,
N
1
形成新码书 )(nC ,置
n
1 n
,转步
骤 2。
二、实验目的
采用矢量量化算法(LBG)获得图像压缩所需要的码书,通过码书实现图
像压缩编码。
三、实验内容
对给定的一幅图片
四、实验步骤
(1) 对训练图片,采用 LBG 算法获取最佳码书设计;
(2) 采用熵编码实现图像索引编号的压缩。
五、程序代码
clear all;
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);
for i=1:m
for j=1:n
data1((i-1)*n+j)=data(i,j);
end
end
M1=floor(m*n/siz_word);
r=mod(m*n,siz_word);
if r>0
M1=M1+1;
end
data2=zeros(M1,siz_word);
l=1;
A=zeros(siz_word,1);
r=1;
for i=1:m*n
A(r)=data1(i);
if r==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);
for i=1:siz_book*siz_word
A(r)=data1(i);
if r==siz_word
code_book(l,:)=A;
l=l+1;
r=1;
r=r+1;
else
end
end
MIU=zeros(M1,siz_book);
t=1;
while t==1
for i=1:M1
B=zeros(siz_word,1);
B=data2(i,:);
A=zeros(siz_word,1);
A=code_book(1,:);
tep=0.0;
for l=1:siz_word
tep=tep+(A(l)-B(l))^2;
end
r=1;
for j=2:siz_book
A=code_book(j,:);
temp=sum((A-B).^2);
if temp
end
MIU(i,r)=1.0;
end
t=0;
code_book1=zeros(siz_book,siz_word);
for j=1:siz_book
for l=1:siz_word
tep=0.0;
for i=1:M1
code_book1(j,l)=code_book1(j,l)+MIU(i,j)*data2(i,l);
tep=tep+MIU(i,j);
end
if tep>0
code_book1(j,l)=code_book1(j,l)/tep;
else
code_book1(j,l)=0.0;
end
end
end
tep=0.0;
for j=1:siz_book
for l=1:siz_word
tep=tep+(code_book1(j,l)-code_book(j,l))^2;
end
end
if tep/siz_book<0.000001
t=0;
end
code_book=code_book1;
end
%编码后图像恢复过程
data3=zeros(M1,siz_word);
for i=1:M1
for j=1:siz_book
if MIU(i,j)==1
t=j;
end
end
data3(i,:)=code_book(t,:);
end
data5=zeros(m,n);
for i=1:m
for j=1:n
tep=(i-1)*n+j;