[m,n]=size(I)
J=[]
for i=1:m
value=I(i,1)
num=1
for j=2:n
if I(i,j)==value
num=num+1
else J=[J num value]
num=1
value=I(i,j)
end
end
J=[J num value 0 0]
end
disp('原图像大小:')
whos('I'备缺)
disp('压缩图手贺像大小:')
whos('J')
disp('图像压缩比:'仿薯辩)
disp(m*n/length(J))
2 JPEG基本原理JPEG对灰度图像的压缩处理过程如图1所示。JPEG对灰度图像的压缩处理过程主要包括:图像分割,离散余弦变换(DCT),量化(Quantization),“z”形排序(Zigzag Scan),差分脉冲编码调制(Differential Pulse CodeModulation,DPCM)对直流系数(Dc),行程长度编码(Run—kngth Encoding,RLE)对交流系数(Ac),霍夫曼(Hufman)编码等。
图像压缩过程如图1所示。
JPEG标准的特点是离散余弦变换,它可以将8×8图像的空间表达式转换为频率域,经二维DCT变换后,第零行零列是低频分量,其余为拿凯高频分量。
3.1 JPEG压缩模块设计
按照压缩流程,JPEG压缩实现可以划分为三个模块:DCT变换模块,主控模块,编码输出模块。压缩模块组成如图3所示:DCT变换模块:把输入其中的像素值进行DCT变换。主控模块:控制数据的读写并送入DCT变换模块,对变换后的数据进行量化,量化完后进行z扫描。编码输出模块:对经过扫描和量化的数据进行编码并输出。
3 压缩系统的构成和实现
图像压缩的过程:首先把图像分为8×8的块,然后进行二维DCT变换,变换之后的数据高频和低频分开;接着开始z扫描,z扫描是一个排序过程,它可以让高频和低频分量按照编码的需要排列;Z扫描之后的数据需要量化后才能编码,量化是使数据量减少达到压缩目的重要环节(量化表见表1);最后对扫描后的数据编码,低频分量用差分脉冲编码和低频霍夫曼编码,高频分量用行程长度编码。图像压缩系统的结构图如2所示,由数据流控制模块、外部存储器接口模块、存储待压缩数据RAM、JPEG压缩模块、压缩数据接收模块、数据发送模块组成:
1)数据流控制模块:控制数据流的方向。
2)外部存储器接口模块:提供SRAM的读写控制时序。
3)接收压缩数据模块:接收压缩模块发送来的数据并且通过读写SRAM控制模块存储到SRAM里面慎敏拆。
4)数据发送模块:产生和数传约定的时序并把压缩数据发出。
3.1 JPEG压缩模块设计
按照压缩流程,JPEG压缩实现可以划分为三个模块:DCT变换模块,主控模块,编码输出模块。压缩模块组成如图3所示:DCT变换模块:把输入其中的像素值进行DCT变换。主控模块:控制数据的读写并送入DCT变换模块,对变换后的数据进行量化,量化完后进行z扫描。编码输出模块:对经过扫描和量化的数据进行编码并输出。
3.2 编码模块实现细节
下面举例分别介绍对直流分量和交流分量不同的编码规则。
假设DC值为一l5,它的霍夫曼码字由AB两部分组成,A为其长度的霍夫曼编码,B为其数值的幅度。首先通过查找表查找其绝对值范围为4,即其值可以用一个四位的二进制数来表示;然后用查到的4在直流霍夫曼码表中查找相应的霍夫曼编码,其对应的霍夫曼编码为一个三位的二进制数101,那么这个DC系的编码为它值的长度对应的霍夫曼编码再加上其幅度。对于一15幅度为0000(最高位为符号位,0为负,1为正)。计算幅值的过程:在长度为4的范围有16个值,即从一l5到15,用4位二进制补码来表示为0001、0010、0011、0100、0101、0110、0111、1000、1000、1001、1010、1011、1100、1101、1110、1111。负数的幅值就是其绝对值的4位二进制表示的反码,反码等于补码减1,0000,0001,0010,0011,0100,0101,0110,0111,0111,1000,1001,1010,1011,1100,1101,1110,1111。这样DC值为一15的编码即为1010000。交流系数和直流系数相比多了零行程编码。零行程编码的步骤:按照扫描之后的顺序逐个检测交流系数,并用变量来记录零系数的个数,遇到非零系数时首先观察它和前一个非零系数之间有多少个零系数,如果超过了16个则对前16个零单独编码,在霍夫曼码表宽枣中有单独的ZRL代码对它编码,然后观察剩余零的个数是否超过16个,如果超过仍然执行上一步 *** 作,如果小于16则把剩余零的个数和非零交流系作为参数对应霍夫曼码表进行编码。
h.color=[1 1 1]load wmandril
figure(h)
subplot(1,2,1)
nbc=size(map,1)
colormap(gray(nbc))
image(wcodemat(X,nbc))
title('original image')
axis square
[C,S]=wavedec2(X,2,'db4')
thr=20
[Xcompress1,cmd,lxd,PERF0,PERFL2]=...
wdencmp('gbl',C,S,'db4',2,thr,'h'帆含,1)
subplot(1,2,2)
image(wcodemat(Xcompress1,nbc))
title(['compressed image threshold='态睁笑,num2str(thr)])
axis square
disp('小波系数中设置0的系数个数百分比')
PERFL2
disp('压缩后图像剩余百分比')
PERF0
第二种
h.color=[1 1 1]
load wmandril
figure(h)
subplot(1,2,1)
nbc=size(map,1)
colormap(gray(nbc))
image(wcodemat(X,nbc))
title('original image')
axis square
[C,S]=wavedec2(X,2,'db4')
thr=20
[Xcompress1,cmd,lxd,PERF0,PERFL2]=...
wdencmp('gbl',C,S,'db4',2,thr,'h',1)
subplot(1,2,2)
image(wcodemat(Xcompress1,nbc))
title(['compressed image threshold=',num2str(thr)])
axis square
disp('小波系数中设置0的系数个数早和百分比')
PERFL2
disp('压缩后图像剩余百分比')
PERF0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)