《数据压缩与信源编码》实验报告S

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步骤2:用码书 中的各码字作为质心,根据最佳划分原则把训练矢量集 划分为 个胞腔 , 满足
步骤3:计算平均失真
判断相对误差是否满足
若满足,则停止算法,码书 就是所求的码书。否则,转步骤4。
步骤4:根据最佳码书条件,计算各胞腔的质心,即
由这 个新质心 形成新码书 ,置 ,转步骤2。
三、实验设备、仪器及材料
李斌
项 目 学 分
一、实验目的
采用矢量量化算法(LBG)获得图像压缩所需要的码书,通过码书实现图像压缩编码。
二、实验原理
要想得到好的性能编码,仅采用标量量化是不可能的。当把多个信源符号联合起来形成多维矢量,再对矢量进行标量量化时自由度将更大,同样的失真下,量化基数可进一步减少,码率可进一步压缩。这种量化叫矢量量化。
学 号
成 绩
学生所在学院
电气与电子信息学院
年级/专业/班
信息工程14(3)-1
课 程 名 称
数据压缩与信源编码
课 程 代 码
6088619
实验项目名称
基于DCT变换的图像压缩技术
项 目 代 码
实验二
指 导 教 师
李斌
项 目 学 分
一、实验目的
利用离散余弦变换进行图像压缩。
二、实验原理
1.DCT变换
离散余弦变换(DCT)是一种与离散傅立叶变换紧密相关的正交变换,8×8的二维离散余弦变换可以将图像的空间表达式转换到频率域,只用少量的数据点来表达图像,用f(x,y)表示8×8的图像块象素值,F(u,v)表示二维离散余弦变换后的值,具体表达式如下:
end
end
figure(2)
imshow(uint8(data5)); %显示恢复图像
title('矢量量化编码后恢复的图像')
五、实验过程记录(数据、图表、计算等)
六、实验结果分析及问题讨论
西华大学实验报告(理工类)
开课学院及实验室: 电气信息学院 6A222实验时间 :2017年4月6日
学 生 姓 名
72 92 95 98 112 100 103 99 ];
fori=1:8:200
for j=1:8:200
P=I(i:i+7,j:j+7);
K=T*P*T';
I2(i:i+7,j:j+7)=K;
K=K./a1;量化
K(abs(K)<0.03)=0;
I3(i:i+7,j:j+7)=K;
end
end
figure;
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 ]
%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
B2=blkproc(B,[8 8],'P1.*x',mask) %只保留DCT变换的10个系数
I2=blkproc(B2,[8 8],'P1*x*P2',T',T) %重构图像
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);
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;
for j=1:siz_book
for l=1:siz_word
tep=tep+(code_book1(j,l)-code_book(j,l))^2;
imshow(I2);
title('DCT变换后的频域图像'); %显示DCT变换后的频域图像
fori=1:8:200
for j=1:8:200
P=I3(i:i+7,j:j+7).*a1; %反量化
K=T'*P*T;
I4(i:i+7,j:j+7)=K;
end
end
figure;
imshow(I4);
西华大学实验报告(理工类)
开课学院及实验室:电气信息学院 6A222实验时间 :2017年4月6日
学 生 姓 名
学 号
成 绩
学生所在学院
电气与电子信息学院
年级/专业/班
信息工程14(3)-1
课 程 名 称
数据压缩与信源Байду номын сангаас码
课 程 代 码
6088619
实验项目名称
码书的设计和使用
项 目 代 码
实验一
指 导 教 师
(7)从树根开始写出每一符号的“0”、“1”。用标准哈夫曼编码对图像进行编码时效率很高,但需要对原始图像扫描两遍,第一遍要精确统计出每个像素值出现的概率,第二遍是建立哈夫曼树并编码,数据压缩和解压速度较慢,因此,出现了一种改良的哈夫曼编码,它的变长码字不是实时产生而是一个固定的表,在编码和解码过程中不用计算符号概率和排序,直接查表得到,但这个表必须经过大量的统计工作并精心设计才能达到较高的编码效率。在静态图像压缩国际标准(JPEG标准)中,专家组已经对大量自然图像进行了统计,得到了适合于静态自然图像编码的哈夫曼表,在实际编码过程中,我们可直接应用此表进行编码和解码。
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);
3.“Z”字型扫描
量化后的数据本来已经可以直接进行游程编码,但为了提高游程编码的效率,我们必须尽量增加零游程的长度。基于量化后系数的排列特征,采用“Z”字型扫描能有效增加零游程的长度。“Z”字型扫描轨迹如图2.2所示:
4.哈夫曼(Huffman)编码及解码
哈夫曼编码是1952年由Huffman提出的编码方法,基本思想是根据源数据符合出现的概率大小进行编码,出现概率大的符号分配越短的码字,出现概率越小的符号分配越长的码字,从而达到用尽量少的比特数表示数据源,标准哈夫曼编码步骤如下:
操作系统:Windowsxp;
软件:MATLAB
四、实验步骤(按照实际操作过程)
1.码书的设计
clear all;
data=imread('cameraman.tif');%调入原始图像
data=double(data)/255;
%归一化
[m,n]=size(data); %求出图像的行数和列数
figure(1)
r=1;
fori=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);
2.编码
%LBG算法开始
%初始化码书
l=1;
r=1;
A=zeros(siz_word,1);
2.量化编码
数据压缩中的量化处理,不是对A/D转换量化,而是对正交变换后的数据进行量化处理,量化输入值的动态范围很大,而量化的输出只能取有限个整数,量化后的数值用较少的比特数便可表示。量化处理总是把一批输入量化到一个输出级上,这样降低了数值的精度,但减少了数据量。
DCT的输出系数中,左上角的数据表示低频分量,人眼比较敏感,应该用较高的精度来表示,而右下角的数据可以用较低的精度来表示,因此,我们可以定义一个量化表对不同的数据采用不同的量化等级,这个量化表可以根据期望的压缩比进行调整,一般来说,量化表元素值越大压缩比越大,当然图像失真度也越大。
fori=1:siz_book*siz_word
A(r)=data1(i);
if r==siz_word
code_book(l,:)=A;
l=l+1;
r=1;
else
r=r+1;
end
end
MIU=zeros(M1,siz_book);
t=1;
while t==1
fori=1:M1
B=zeros(siz_word,1);
三、实验设备、仪器及材料
操作系统:Windowsxp;
软件:MATLAB
四、实验步骤(按照实际操作过程)
I=imread('cameraman.tif')
I=im2double(I) %转换图像矩阵为双精度型。
J=dct2(I);
T=dctmtx(8) %产生二维DCT变换矩阵
a1=[16 11 10 16 24 40 51 61;
title('复原图像');
B=blkproc(I,[8,8],'P1*x*P2',T,T')
%计算二维DCT,矩阵T及其转置是DCT函数P1*X*P2的参数
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
if temp<tep
r=j;
tep=temp;
end
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;
fori=1:M1
code_book1(j,l)=code_book1(j,l)+MIU(i,j)*data2(i,l);
一种有效和直观的矢量量化码书设计算法——LBG算法(也叫GLA算法)是由Linde、Buzo和Gray于1980年首先提出来的。该算法基于最佳矢量量化器设计的最佳划分和最佳码书这两个必要条件,且是Lloyd算法在矢量空间的推广,其特点为物理概念清晰、算法理论严密及算法实现容易。
设训练矢量集为 ,待产生的码书为 ,其中 , , ,则码书设计过程就是需求把训练矢量集 分成 个子集 的一种最佳聚类方案,而子集 的质心矢量 作为码字。假设平方误差测度用来表征训练矢量 和码字 之间的失真,即:
(4.1)
其反变换如下式:
(4.2)
其中,
(4.3)
二维离散余弦变换核具有可分离性,即可以先对每行进行一维离散余弦变换,
再对每列进行一维离散余弦变换,因此,二维离散余弦变换可表示为:
(4.4)
(4.5)
如果直接按照公式计算,其计算量很大,所以,实际应用中普遍采用快速傅立叶变换(FFT)算法来实现离散余弦变换的快速算法。
则码书设计的准则可用下列数学形式表达:
最小化
约束条件 ,
其中 为 矩阵,其元素满足:
矩阵 可看作训练矢量的聚类结果。根据 ,可计算码字:
其中 代表子集 中训练矢量的数目,或者说是矩阵 第 行 中非零元素的数目。
针对训练矢量集为 ,其LBG算法的具体步骤如下:
步骤1:给定初始码书 ,令迭代次数 ,平均失真 ,给定相对误差门限 。
fori=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);
(1)统计数据源符号出现的概率,得到不同概率的信息符号;
(2)将数据源符号按概率递减顺序排列;
(3)把两个最小概率相加作为新符号的概率,并按(2)重排;
(4)重复(1)、(2),直到概率为1;
(5)在每次合并信源时,将合并的信源分别赋“0”和“1”;
(6)寻找从每一信源符号到概率为1处的路径,记录路径上的“0”和“1”;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
end
end
iftep/siz_book<0.000001
t=0;
end
code_book=code_book1;
end
3.解码
%编码后图像恢复过程
data3=zeros(M1,siz_word);
fori=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);
fori=1:m
for j=1:n
tep=(i-1)*n+j;
i1=floor(tep/siz_word);
if i1==0
i1=1;
end
j1=mod(tep,siz_word);
if j1==0
j1=siz_word;
end
data5(i,j)=floor(data3(i1,j1)*255);
相关文档
最新文档