实验四dct变换huffman编码图像压缩
- 格式:doc
- 大小:701.00 KB
- 文档页数:11
实验程序和结果:实验所使用的图像:1、利用Huffman进行JPEG图像压缩编码程序:I=imread('F\.jpg');pix(256)=struct('huidu',0.0,...%灰度值'number',0.0,...%对应像素的个数'bianma','');%对应灰度的编码[m n l]=size(I);fid=fopen('huffman.txt','w');%huffman.txt是灰度级及相应的编码表fid1=fopen('huff_compara.txt','w');%huff_compara.txt是编码表huf_bac=cell(1,l);for t=1:l%初始化结构数组for i=1:256pix(i).number=1;pix(i).huidu=i-1;%灰度级是0—255,因此是i-1pix(i).bianma='';end%统计每种灰度像素的个数记录在pix数组中for i=1:mfor j=1:nk=I(i,j,t)+1;%当前的灰度级pix(k).number=1+pix(k).number;endend%按灰度像素个数从大到小排序for i=1:255for j=i+1:256if pix(i).number<pix(j).numbertemp=pix(j);pix(j)=pix(i);pix(i)=temp;endendend%因为有的灰度值在图像中可能没有对应的像素值,所以要%找出在图像中存在像素的灰度级的个数,并保存在num中for i=256:-1:1if pix(i).number ~=0break;endendnum=i;count(t)=i;%记录每层灰度级%定义用于求解的矩阵clear huffmanhuffman(num,num)=struct('huidu',0.0,...'number',0.0,...'bianma','');huffman(num,:)=pix(1:num);%矩阵赋值for i=num-1:-1:1p=1;%算出队列中数量最少的两种灰度的像素个数的和sum=huffman(i+1,i+1).number+huffman(i+1,i).number;for j=1:i%如果当前要复制的结构体的像素个数大于sum就直接复制if huffman(i+1,p).number>sumhuffman(i,j)=huffman(i+1,p);p=p+1;else%如果当前要复制的结构体的像素个数小于或等于sum就插入和的结构体%灰度值为-1标志这个结构体的number是两种灰度像素的和huffman(i,j).huidu=-1;huffman(i,j).number=sum;sum=0;huffman(i,j+1:i)=huffman(i+1,j:i-1);break;endendend%开始给每个灰度值编码for i=1:num-1obj=0;for j=1:iif huffman(i,j).huidu==-1obj=j;break;elsehuffman(i+1,j).bianma=huffman(i,j).bianma;endendif huffman(i+1,i+1).number>huffman(i+1,i).number%说明:大概率的编0,小概率的编1,概率相等的,标号大的为1,标号小的为0 huffman(i+1,i+1).bianma=[huffman(i,obj).bianma '0'];huffman(i+1,i).bianma=[huffman(i,obj).bianma '1'];elsehuffman(i+1,i+1).bianma=[huffman(i,obj).bianma '1'];huffman(i+1,i).bianma=[huffman(i,obj).bianma '0'];endfor j=obj+1:ihuffman(i+1,j-1).bianma=huffman(i,j).bianma;endendfor k=1:count(t)huf_bac(t,k)={huffman(num,k)}; %保存endend%写出灰度编码表for t=1:lfor b=1:count(t)fprintf(fid,'%d',huf_bac{t,b}.huidu);fwrite(fid,' ');fprintf(fid,'%s',huf_bac{t,b}.bianma);fwrite(fid,' ');endfwrite(fid,'%');%先写灰度值,再写灰度级所对应的哈夫曼编码,并用将每个层级的灰度隔开end%按原图像数据,写出相应的编码,也就是将原数据用哈夫曼编码替代for t=1:lfor i=1:mfor j=1:nfor b=1:count(t)if I(i,j,t)==huf_bac{t,b}.huiduM(i,j,t)=huf_bac{t,b}.huidu;%将灰度级存入解码的矩阵fprintf(fid1,'%s',huf_bac{t,b}.bianma);fwrite(fid1,' ');%用空格将每个灰度编码隔开break;endendendfwrite(fid1,',');%用空格将每行隔开endfwrite(fid1,'%');%用%将每层灰度级代码隔开endfclose(fid);fclose(fid1);M=uint8(M);save('M')%存储解码矩阵编码结果:Huffman编码表:Huffman代码:Huffman解码程序:function huf_decode%哈夫曼编码解码load MI=imread('F:\Heat.jpg');subplot(1,2,1),imshow(I),title('原图')%读出原图subplot(1,2,2),imshow(M),title('huffman解码后的图')%读出解码后的图解码结果:2、利用行程编码进行图像压缩的MATLAB程序function yc%行程编码算法%读图I=imread('zbz.jpg');[m n l]=size(I);fid=fopen('yc.txt','w');%yc.txt是行程编码算法的灰度级及其相应的编码表%行程编码算法sum=0;for k=1:lfor i=1:mnum=0;J=[];value=I(i,1,k);for j=2:nif I(i,j,k)==valuenum=num+1;%统计相邻像素灰度级相等的个数if j==nJ=[J,num,value];endelse J=[J,num,value];%J的形式是先是灰度的个数及该灰度的值 value=I(i,j,k);num=1;endendcol(i,k)=size(J,2);%记录Y中每行行程行程编码数sum=sum+col(i,k);Y(i,1:col(i,k),k)=J;%将I中每一行的行程编码J存入Y的相应行中 endend%输出相关数据[m1,n1,l1]=size(Y);disp('原图像大小:')whos('I');disp('压缩图像大小:')whos('Y');disp('图像的压缩比:');disp(m*n*l/sum);%将编码写入yc.txt中for k=1:l1for i=1:m1for j=1:col(i,k)fprintf(fid,'%d',Y(i,j,k));fwrite(fid,' ');endendfwrite(fid,' ');endsave('Y')%存储,以便解码用save('col')fclose(fid);结果:编码代码:function yc_decode%行程编编码解码load Y %下载行程编码Yload col %下载Y中每行行程行程编码数[m,n,l]=size(Y);for k=1:lfor i=1:mp=1;for j=1:2:col(i,k)d=Y(i,j,k);%灰度值的个数for c=p:p+d-1X(i,c,k)=Y(i,j+1,k);%将d个灰度值存入X中endp=p+d;endendendI=imread('zbz.jpg');subplot(1,2,1),imshow(I),title('原图')%读出原图subplot(1,2,2),imshow(X),title('行程编码解码后的图')%读出解码后的图解码后:3、利用DCT进行图像压缩的MATLAB程序I=imread(‘rice.png’); %读入原图像;I=im2double(I); %将原图像转为双精度数据类型;T=dctmtx(8); %产生二维DCT变换矩阵B=blkproc(I,[8 8],’P1*x*P2’,T,T’); %计算二维DCT,矩阵T 及其转置T’是DCT函数P1*x*P2的参数Mask=[ 1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 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); %逆DCT,重构图像Subplot(1,2,1);Imshow(I);title(‘原图像’); %显示原图像Subplot(1,2,2);Imshow(I2);title(‘压缩图像’);%显示压缩后的图像实验结果:。
Huffman编码压缩效率分析Huffman编码是一种常用的数据压缩算法,通过使用变长编码来对不同符号进行表示,使得出现频率高的符号可以使用较短的编码,而出现频率低的符号则可以使用较长的编码,以此来实现数据压缩的效果。
本文将就Huffman编码的压缩效率进行深入分析。
一、Huffman编码的原理Huffman编码的压缩效率是建立在理解其原理的基础之上的。
Huffman编码的原理是通过构建霍夫曼树来实现,具体步骤如下:1. 统计输入数据中各个符号的出现频率;2. 将所有的符号按照出现频率构建为叶子节点,生成一个森林;3. 重复以下步骤,直到所有节点都合并为一个根节点:a. 从森林中选择出现频率最小的两个节点,合并为一个新节点;b. 将新节点放回森林中;4. 根据生成的霍夫曼树,给每个符号赋予唯一的编码;5. 将原始数据根据所生成的编码进行替换;6. 按照编码后的位数进行数据压缩。
二、Huffman编码的压缩效率Huffman编码作为一种无损压缩算法,其压缩效率取决于输入数据中各个符号的出现频率。
出现频率越高的符号所得到的编码越短,从而可以实现更高的压缩效率。
为了更直观地了解Huffman编码的压缩效率,我们可以通过一个简单的例子来进行说明。
假设输入数据包含以下4个符号A、B、C、D,并且它们的出现频率分别为0.4、0.3、0.2、0.1。
根据Huffman编码的原理,我们可以得到如下的霍夫曼树:```A: 0.4/ \B: 0.3/ \C: 0.2/ \D: 0.1```根据霍夫曼树给符号赋予编码,我们可以得到编码表如下:A: 0B: 10C: 110D: 111假设输入数据为"AABCD",根据编码表替换后,数据变为"00110111",可以看出编码后的数据长度为8位,相比原始数据的长度为5位进行了压缩。
通过以上例子可以看出,Huffman编码通过根据出现频率来给符号赋予编码,使得出现频率高的符号获得较短的编码,从而实现数据的压缩。
桂林理工大学实验报告(2013~ 2014 学年度第一学期)班级: 学号 : 姓名: 实验名称: 实验四图像DCT变换编码与压缩日期: 2013年12月12日一、实验题目:图像DCT变换编码与压缩二、实验目的:(1)掌握离散余弦变换DCT的实现方法, 了解DCT的幅度分布特性, 从而加深对DCT变换的认识。
(2)掌握图像DCT变换编码的实现方法, 从而加深对变换编码压缩图像原理的理解。
三、实验内容:编程实现图像DCT变换编码。
四、预备知识:(1)熟悉DCT原理。
(2)熟悉变换编码原理。
(3)熟悉在MA TLAB环境下对图像文件的I/O操作。
五、实验原理:变换编码是在变换域进行图像压缩的一种技术。
图2.2.1显示了一个典型的变换编码系统。
压缩图像输入图像N×N图2.2.1 变换编码系统在变换编码系统中, 如果正变换采用DCT变换就称为DCT变换编码系统。
DCT用于把一幅图像映射为一组变换系数, 然后对系数进行量化和编码。
对于大多数的正常图像来说, 多数系数具有较小的数值且可以被粗略地量化(或者完全抛弃), 而产生的图像失真较小。
DCT是仅次于K-L变换的次最佳正交变换, 且以获得广泛应用, 并成为许多图像编码国际标准的核心。
离散余弦变换的变换核为余弦函数, 计算速度快, 有利于图像压缩和其他处理。
对于N×N的数字图像, 二维DCT变换的正反变换可表示为:11001100(21)(21)(,)()()(,)cos cos222(21)(21)(,)()()(,)cos cos22N Nx yN Nu vx u y vF u v c u c v f x yN Nx u y vf x y c u c v F u vN N Nππππ--==--==++=++=∑∑∑∑(2.2.1)其中,00()()1,1,2,...,1u vc u c vu v N⎧==⎪==⎨=-⎪⎩或MA TLAB图像处理工具箱实现离散余弦变换有两种方法:(1)使用函数dct2, 该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。
计算机图像处理中的图像压缩与图像恢复算法图像压缩和图像恢复算法是计算机图像处理领域中非常重要的技术,它们可以对图像进行有效的压缩和恢复,实现图像数据在存储、传输和显示过程中的高效利用。
本文将介绍图像压缩与图像恢复算法的基本原理和常用方法。
一、图像压缩算法图像压缩算法是通过去除冗余信息和减少图像数据量来实现图像压缩的。
常见的图像压缩算法主要包括无损压缩和有损压缩两种。
1. 无损压缩算法无损压缩算法是指在图像压缩的过程中不丢失原始图像的任何信息,使得压缩后的图像与原始图像完全一致。
常用的无损压缩算法有:(1)Huffman 编码算法:通过构建霍夫曼树将出现频率较高的像素值赋予较短的编码长度,提高编码效率;(2)LZW 压缩算法:通过构建字典表来进行压缩,将图像中重复的像素值用较短的编码表示,进一步减少数据量。
2. 有损压缩算法有损压缩算法是在压缩的过程中有意丢失一定的图像信息,从而实现更高的压缩比。
常用的有损压缩算法有:(1)JPEG 压缩算法:通过离散余弦变换(DCT)将图像转化为频域表示,再利用量化和熵编码等技术对图像数据进行压缩;(2)Fractal 压缩算法:将图像分解为一系列局部细节,并利用自相似性进行压缩。
二、图像恢复算法图像恢复算法是指在图像受到损坏或失真后,通过一系列算法恢复出原始图像的过程。
常见的图像恢复算法主要包括插值算法和去噪算法。
1. 插值算法插值算法是一种用于根据已知图像信息来估计未知像素值的方法。
常见的插值算法有:(1)最近邻插值算法:根据离目标像素最近的已知像素值进行估计;(2)双线性插值算法:利用目标像素周围的已知像素值进行加权平均估计;(3)双三次插值算法:在双线性插值的基础上,通过考虑更多的邻域像素值进行估计。
2. 去噪算法去噪算法可以有效地去除图像中的噪声,恢复出原始图像的清晰度。
常见的去噪算法有:(1)中值滤波算法:利用像素周围邻域像素的中值来估计目标像素值,对于椒盐噪声和脉冲噪声有较好的去除效果;(2)小波去噪算法:利用小波变换将图像分解为不同的频率分量,通过阈值处理来剔除噪声。
第1篇一、实验目的1. 了解数据压缩的基本原理和方法。
2. 掌握常用数据压缩算法的应用。
3. 分析不同数据压缩算法的性能和适用场景。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 数据压缩工具:Huffman编码、LZ77、LZ78、RLE、JPEG、PNG三、实验内容1. Huffman编码2. LZ77编码3. LZ78编码4. RLE编码5. 图像压缩:JPEG、PNG四、实验步骤1. Huffman编码(1)设计Huffman编码树,计算每个字符的频率。
(2)根据频率构建Huffman编码树,为每个字符分配编码。
(3)将原始数据按照Huffman编码进行编码,得到压缩数据。
(4)解压缩:根据编码表还原原始数据。
2. LZ77编码(1)设计LZ77编码算法,查找匹配的字符串。
(2)将原始数据按照LZ77编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
3. LZ78编码(1)设计LZ78编码算法,查找匹配的字符串。
(2)将原始数据按照LZ78编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
4. RLE编码(1)设计RLE编码算法,统计连续字符的个数。
(2)将原始数据按照RLE编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
5. 图像压缩:JPEG、PNG(1)使用JPEG和PNG工具对图像进行压缩。
(2)比较压缩前后图像的质量和大小。
五、实验结果与分析1. Huffman编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为25KB。
(2)压缩效率:压缩比约为4:1。
2. LZ77编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为35KB。
(2)压缩效率:压缩比约为3:1。
3. LZ78编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为30KB。
(2)压缩效率:压缩比约为3.3:1。
Huffman编码在数据压缩中的实际应用案例Huffman编码是一种常用的数据压缩算法,它通过利用字符出现频率的统计信息,将出现频率较高的字符用较短的编码表示,从而实现数据的高效压缩。
本文将介绍Huffman编码在实际应用中的各种案例。
1. 文本文件压缩文本文件是最常见的需要进行压缩的数据类型之一。
Huffman编码可以通过分析文本中出现的字符及其频率,为每个字符生成唯一的编码。
根据字符出现的频率不同,生成的编码长度也不同,使得出现频率较高的字符可以用更短的编码表示,从而实现对文本文件的有效压缩。
例如,一个包含大量英文字符的文本文件,使用Huffman编码可以将每个字符表示为一个较短的二进制序列,从而极大地减少文件大小。
2. 图像压缩图像是另一个常见的需要进行压缩的数据类型。
Huffman编码在图像压缩中的应用主要体现在色彩编码上。
对于彩色图像,Huffman编码可以将不同的颜色值映射为不同的二进制序列,使得出现频率较高的颜色可以用较短的编码表示。
通过使用Huffman编码,可以将图像文件压缩为更小的文件大小,而且在解压缩时能够恢复高质量的图像。
3. 音频压缩音频文件的压缩通常是有损压缩,即通过减少音频数据的冗余和不重要的部分来实现压缩。
Huffman编码可以用于对音频信号进行压缩编码,特别是在语音文件压缩中应用广泛。
通过对语音中的音频信号进行采样和量化,并使用Huffman编码对采样后的数据进行压缩,可以显著减少语音文件的大小。
这在电信领域中被广泛应用于语音通信和存储。
4. 视频压缩类似于音频压缩,视频压缩也是有损压缩的一种形式。
在视频压缩中,Huffman编码常常与其他压缩算法(如离散余弦变换或小波变换)结合使用,以进一步减小文件大小。
Huffman编码可以用于对视频中的图像帧进行编码,从而减少文件大小并提高传输和储存效率。
例如,在MPEG标准中,Huffman编码被用于对DCT变换后的视频图像进行熵编码,以实现高效的视频压缩。
用Huffman编码实现图像压缩摘要:当前,网络和多媒体技术日新月异,信息量急速膨胀。
针对这种情况,本文探讨了它的解决方法——数据压缩(主要是图像压缩)。
着重研究了无失真条件下的最佳编码方法——huffman编码,对其方法的优劣做了较为客观的评价。
关键词:图像压缩编码 huffman编码中图分类号:tp393.03 文献标识码:a 文章编号:1007-9416(2011)12-0238-021、前言随着科技的发展,现在各种各样的数据和信息正在急速膨胀,每天出现的新知识正以近乎指数的规律逐日上升。
如何方便快速地存储、处理和传输这些日益增加的信息,使之更好的为我们服务,已经成为多数行业共同的呼声。
特别是近几年来随着网络走进普通家庭,昔日老牛拉破车似的网速已让多数人所不能容忍。
因为数据在数据传输时,要占据很大的信道容量。
为此,人们想到了采用对图像新的表达方法以减小表示一幅图像所需数据量,这就是图像编码要解决的主要问题。
由于图像编码减少了数据量,因此人们也常称图像编码为图像压缩。
本文将着重研究huffman编码方法,并形成一个对huffman编码方法的较为完整的评价。
2、正文2.1 huffman编码huffman编码的主导思想是根据数据符号发生的概率进行编码。
在源数据中出现概率越高的符号,相应的码长越短;出现概率越小的符号,其码长越长,从而达到用尽可能少的码符号表示源数据。
huffman编码方法是接近压缩比上限的一种最佳的编码方法。
2.2 具体编码过程(1)将信源符号按出现概率由大到小排列。
(2)将2个最小概率相加,形成一新的概率集合,对应一新的信源,符号数减小一个,即具有q-1个符号数,称为缩减信源a。
(3)将缩减信源a中q-1个符号再按概率大小排列。
如符号间概率相等,则排列次序不论。
(4)如此继续,得到具有(q-2)、(q-3)、(q-4)、...个符号的缩减信源b、c、d等,直到只有2个符号为止。
MATLAB中的图像压缩和编码方法图像压缩和编码是数字图像处理的重要领域,在各种图像应用中起着至关重要的作用。
在本文中,我们将探讨MATLAB中的图像压缩和编码方法,包括无损压缩和有损压缩,并介绍其中的一些经典算法和技术。
一、图像压缩和编码概述图像压缩是指通过一定的算法和技术来减少图像数据的存储量或传输带宽,以达到节约存储空间和提高传输效率的目的。
而图像编码则是将原始图像数据转换为一系列二进制编码的过程,以便存储或传输。
图像压缩和编码通常可以分为无损压缩和有损压缩两种方法。
无损压缩是指压缩后的数据可以完全还原为原始图像数据,不会引入任何失真或变化。
常见的无损压缩算法有Run-Length Encoding (RLE)、Lempel-Ziv-Welch (LZW)、Huffman编码等。
这些算法通常针对图像中的冗余数据进行编码,如重复的像素值或相似的图像区域。
有损压缩则是在保证一定程度的视觉质量下,通过舍弃或近似原始图像数据来减小存储或传输的数据量。
常见的有损压缩算法有JPEG、JPEG2000、GIF等。
这些算法通过离散余弦变换(DCT)、小波变换或颜色量化等方法,将图像数据转换为频域或颜色空间的系数,并通过量化、编码和压缩等步骤来减小数据量。
二、无损压缩方法1. Run-Length Encoding (RLE)RLE是一种简单高效的无损压缩算法,通过计算连续重复像素值的数量来减小数据量。
在MATLAB中,可以使用`rle`函数实现RLE编码和解码。
例如,对于一幅图像,可以将连续的像素值(如白色)编码为重复的个数,然后在解码时根据重复的个数恢复原始像素值。
2. Lempel-Ziv-Welch (LZW)LZW是一种字典压缩算法,通过将图像中连续的像素序列映射为一个短代码来减小数据量。
在MATLAB中,可以使用`lzwencode`和`lzwdecode`函数实现LZW 编码和解码。
例如,对于一段连续的像素序列,可以将其映射为一个短代码,然后在解码时根据代码恢复原始像素序列。
DCT快速算法分析及在图像压缩编码中的应用Application of DCT Fast Algorithm Analyse in ImageCompression Code专业:电子信息科学与技术学号:03111230姓名:指导教师:目录内容摘要 (I)Abstract ........................................................................................................................ I I 第一章离散余弦变换 . (3)引言 (3)离散余弦变换定义 (3)DCT的算法 (4)DCT快速算法的研究 (4)第二章图像压缩编码的综述 (5)图象压缩的目的和方法 (5)图象压缩的目的 (6)图象压缩的几种方法 (6) (8)第三章JPEG编码算法 (8)JPEG压缩编码基础 (8)JPEG算法于JPEG小组简介 (9)JPEG压缩 (9)JPEG中的二维DCT (10)DCT的实现 (11)第四章压缩过程 (13)DCT的输出 (13)量化 (14) (14)量化矩阵的选择 (14)编码 (16)Zig-Zag序列 (16)熵编码 (17)结束语 (20)参考文献 (21)致谢 (23)内容摘要本文主要介绍两个方面:DCT快速算法和图像压缩编码。
首先介绍离散余弦变换的定义及其变换方法,并介绍离散余弦变换的几种快速算法,提出六种离散余弦变换的快速算法. 其次讲述图像压缩(JPEG)的目的和编码算法的基本原理,分析图象压缩编码的几种应用方法,着重说明DCT算法在图象压缩中的广泛应用。
以及离散余弦变换(DCT)算法在图像压缩编码中的实现过程。
利用离散余弦变换的某些特点去减少搜索块的数目和缩小搜索块的范围两方面减少分形图像的编码时间。
为了减少对图像的质量影响,对于编码恢复的图像采用了图像平滑的处理方式减少块效应并提出最恰当一种快速算法应用于图像压缩编码中。
《电子线路设计与制作》报告目录1.绪论 (1)2.设计任务 (2)2.1 任务描述 (2)2.2 技术指标 (2)3.设计原理 (3)3.1 原理框图 (3)3.2 程序流程图 (4)3.3 离散余弦变换 (5)3.4 量化 (6)3.4 Z形游程编码 (7)4.运行结果及分析 (8)4.1 不同量化系数图像编解码效果比较 (8)4.2 不同文件类型图像编解码比较 (10)5.总结 (12)6.参考文献 (13)附录 (14)1.绪论MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平[1]。
随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中,但是图像数据的一个显著特点就是信息量大。
具有庞大的数据量,如果不经过压缩,不仅超出了计算机的存储和处理能力,而且在现有的通信信道的传输速率下,是无法完成大量多媒体信息实时传输的,因此,为了更有效的存储、处理和传输这些图像数据,必须对其进行压缩,因此有必要对图像压缩编码进行研究。
由于组成图像的各像素之间,无论是在水平方向还是在垂直方向上都存在着一定的相关性,因此只要应用某种图像压缩编码方法提取或者减少这种相关性, 就可以达到压缩数据的目的。
数字图像包含的冗余信息一般有以下几种:空问冗余、时间冗余、信息熵冗余、统计冗余、结构冗余、视觉冗余以及知识冗余等。
图像压缩算法就是要在保证图像一定的熏建质量的同时,尽可能多的去除这些冗余信息.以达到对图像压缩的目的。
随着科学技术的发展,图像压缩编码技术越来越引起人们的关注。
实验四图像压缩姓名:学号:邮箱:一、实验目的1.掌握DCT变换的原理2.了解DCT变化在图像压缩中的应用3.掌握图像压缩的基本原理及方法4.了解霍夫曼编码原理5.熟悉图像压缩的MATLAB编程二、实验原理DCT是目前比较好的图像变换,它有很多优点。
DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。
由于DCT主要应用在数据和图像的压缩,因此希望原信号的能量在变换后能尽量集中在少数系数上,且这些大能量的系数能处在相对集中的位置,这将有利于进一步的量化和编码。
但是如果对整段的数据或整幅图像来做DCT,那就很难保证大能量的系数能处在相对集中的位置。
因此,在实际应用中,一般都是将数据分成一段一段来做,一般分成8x8或16x16的方块来做。
二维DCT正交变换的公式为:二维DCT逆变换公式:其中三、实验要求利用DCT变换对图像进行压缩,对比不同压缩比下的结果,对比不同压缩比下图像大小的变化。
压缩过程如下图所示:四、实验过程与结果实验程序如下:(先给出主程序,然后给出各功能子函数的程序)主程序:clearload('')%调入170*170大小的一幅彩色lena图像l=imresize(lena,[256 256]);%将图像变换为8的整数倍大小X=rgb2gray(l);Y1=double(X);%读入图像数据lianghua=[16 11 10 16 24 40 51 61;%量化矩阵,量化的程度序决定压缩比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;DCT变换量化huffman编码24 35 55 64 81 104 113 92;49 64 78 87 103 121 120 101;72 92 95 98 112 100 103 99];ilianghua=lianghua;%----------------------------------------------------------%图像压缩%----------------------------------------------------------t=dctmtx(8);J=blkproc(Y1,[8 8],'P1*x*P2',t,t'); %分成8*8块进行DCT变换M=blkproc(J,[88],'round(x./P1)',lianghua); %量化u=abs(min(min(M1));M=(M1./u)+1;data=uint8(M);%Huffman编码要求为无符号整形数组M2=M-double(data);[zipped,info]=huffencode(data);%调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info,data) ; %调用Huffman解码程序进行解压缩k=1;for i=1:256for j=1:256 unzippedray(i,j)=unzipped(k);k=k+1;endendunzippedray= unzippedray';%对解压缩后得到的一维数组进行变换,得到无损的量化后%二维数组,其值与data数组值是一致的,体现了Huffman编码是一种无损编码unzippedray=(double(unzippedray)-1+M2 ).*u;T=blkproc(unzippedray,[88],'x.*P1',ilianghua); %反量化I=blkproc(T,[88],'P1*x*P2',t',t); %8*8DCT反变换%----------------------------------------------------------%调用Huffman编码程序进行解码%显示原始图像和经编码后的图像,显示压缩比,并计算均方根误差得erms=0,表示是Huffman是无失真编码figuresubplot(221);imshow(Y1,[]);axis square;xlabel('原256*256灰度图像'); subplot(222);imshow(I,[]);axis square;xlabel('Huffman解压缩后图像'); subplot(223);imshow((Y1-I),[]);axissquare;xlabel('量化后损失的图像部分');[h,k]=hist((Y1-I),256);%生成直方图数据subplot(224);bar(k,h,'k');title('误差图像直方图');%subplot(224);imshow(I,[]);axis square;xlabel('压缩图像');%erms=compare(data(:),unzipped(:))cr=whos data unzipped zipped%huffencode函数对输入矩阵vector进行Huffman编码,返回%编码后的向量(压缩后数据)及相关信息Huffman编码子程序:function[zipped,info]=huffencode(vector)%输入和输出都是unit8格式%info返回解码需要的机构信息%是添加的比特数%是Huffman码字%是原始图像行数%是原始图像行数%是原始图像数据长度%是最长码长if ~isa(vector,'uint8')error('input argument must be a uint8 vector');end[m,n]=size(vector);vector=vector(:)';f=frequency(vector); %计算各符号出现的概率symbols=find(f~=0);f=f(symbols);[f,sortindex]=sort(f);%将符号按照出现的概率大小排序symbols=symbols(sortindex);len=length(symbols);symbols_index=num2cell(1:len); codeword_tmp=cell(len,1);while length(f)>1 %生产Huffman树,得到码字编码表index1=symbols_index{1};index2=symbols_index{2};codeword_tmp(index1)=addnode(codeword _tmp(index1),uint8(0));codeword_tmp(index2)=addnode(codeword _tmp(index2),uint8(1));f=[sum(f(1:2)) f(3:end)];symbols_index=[{[index1,index2]} symbols_index(3:end)];[f,sortindex]=sort(f);symbols_index=symbols_index(sortindex );endcodeword=cell(256,1);codeword(symbols)=codeword_tmp;len=0;for index=1:length(vector) %得到整个图像所有比特数len=len+length(codeword{double(vector (index))+1});endstring=repmat(uint8(0),1,len);pointer=1;for index=1:length(vector) %对输入图像进行编码code=codeword{double(vector(index))+1 };len=length(code);string(pointer+(0:len-1))=code;pointer=pointer+len;endlen=length(string);pad=8-mod(len,8); %非8整数倍时,最后补pad个0if pad>0string=[stringuint8(zeros(1,pad))];endcodeword=codeword(symbols);codelen=zeros(size(codeword)); weights=2.^(0:23);maxcodelen=0;for index=1:length(codeword)len=length(codeword{index});if len>maxcodelenmaxcodelen=len;endif len>0code=sum(weights(codeword{index}==1)) ;code=bitset(code,len+1);codeword{index}=code;codelen(index)=len;endendcodeword=[codeword{:}];%计算压缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.^(0:7);zipped=uint8(weights*double(string)); %码表存储到一个稀疏矩阵huffcodes=sparse(1,1);for index=1:nnz(codeword)huffcodes(codeword(index),1)=symbols( index);end%填写解码时所需的结构信息=pad;=huffcodes;=cols./length(vector);=length(vector);=maxcodelen;=m;=n;%huffdecode函数对输入矩阵vector进行Huffman编码,%返回解压后的图像数据endHuffman解码子程序:functionvector=huffdecode(zipped,info,image)if~isa(zipped,'uint8')error('input argument must be a uint8 vector');end%产生0,1序列,每位占一个字节len=length(zipped);string=repmat(uint8(0),1,len.*8); bitindex=1:8;for index=1:lenstring(bitindex+8.*(index-1))=uint8(b itget(zipped(index),bitindex));endstring=logical(string(:)');len=length(string);%开始解码weights=2.^(0:51);vector=repmat(uint8(0),1,; vectorindex=1;codeindex=1;code=0;for index=1:lencode=bitset(code,codeindex,string(ind ex));codeindex=codeindex+1;byte=decode(bitset(code,codeindex),in fo);if byte>0vector(vectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;endend%vector=reshape(vector,,;%函数addnode添加节点endaddnode子程序:functioncodeword_new=addnode(codeword_old,ite m)codeword_new=cell(size(codeword_old)) ;for index=1:length(codeword_old)codeword_new{index}=[item codeword_old{index}];end%函数frequency计算各符号出现的概率end频率计数frequency子程序:function f=frequency(vector)if~isa(vector,'uint8')error('input argument must be a uint8 vector');endf=repmat(0,1,256);len=length(vector);for index=0:255f(index+1)=sum(vector==uint8(index)); endf=f./len;%函数decode返回码字对应的符号endbyte子程序:function byte=decode(code,info)byte=(code);end实验结果如下:其中Cr为压缩比的倒数。