基于JPEG压缩编码的数据压缩算法的研究与实现

JPEG压缩方法由于其较高的压缩比和理想的压缩效果，是目前应用最广泛的图像压缩方法。它采用一种特殊的有损压缩算法，将不易被人眼察觉 的图像颜色删除，从而能够将图像压缩在很小的储存空间。JPEG压缩技术十分先进，它用有损压缩方式去除冗余的图像数据，在获得极高的压缩率的同时能展现 十分丰富生动的图像，换句话说，就是可以用最少的磁盘空间得到较好的图像品质。

ABSTRACT II

1.1 图像压缩的意义 1

1.2 JPEG图像压缩的国际标准 2

1.3 本论文的研究内容 3

2.1 JPEG图像压缩技术 4

2.2 JPEG压缩中图像文件的格式 5

2.2.1 BMP图像的格式 5

2.2.2 JPEG图像格式 8

2.3 本章小结 8

3.1 JPEG图像压缩编码方法 9

3.1.1 哈夫曼编码的原理 10

3.1.2 哈夫曼编码在图像压缩中的实现 11

3.2 JPEG图像压缩原理 13

3.2.1 前向DCT变换 14

3.2.2 量化 15

3.2.3 使用哈夫曼可变字长编码器对量化系数进行编码 16

3.3 本章小结 19

4.1 总体设计 20

4.1.1设计思想 20

4.1.2 模块设计 20

4.2 JPEG图像压缩软件的实现 21

4.2.1 BMP图像的读入、显示模块 22

4.2.2 DCT量化编码模块 25

4.2.3 组成位数据流模块 29

4.2.4 JPEG图像存储模块 31

4.2.5 解压缩模块 31

4.3 软件应用 32

4.4 压缩效果的评价 33

4.4.1 压缩效果理论分析 34

4.4.2 压缩效果实际分析 34

4.5 本章小结 35

5.1 JPEG图像压缩结论 36

5.2 JPEG图像压缩前景分析 36

ABSTRACT

JPEG compression is the most widely used image compression method because of its higher compression ratio and ideal compression effect. It uses a special lossy compression algorithm and deletes colors of images that is not detected easily by human eye, thus images can be compressed in a small storage space. JPEG compression technology is very advanced, it is used lossy compression methods to remove redundant image data. Thus, high compression ratios can be got, at the same time, a very rich and vivid images can be displayed, in other words, it is possible to get better image quality with the least disk space.

The paper introduces the JPEG compression algorithm firstly, including its history and the basic situation of this stage, compression principle, and so on. Referring to the JPEG compression method, the paper focuses on the basic tenets of Huffman coding and run-length coding and their specific application in JPEG compression algorithm. To transform coding method as an example, it introduces the discrete cosine transform (DCT) the basic process. Finally, Using the VC + +, it involves several basic modules of JPEG compression process and realizes the BMP images and JPEG image conversion, which is the most important ideological basis for programming.

KEY WORDS：Image compression, JPEG, DCT, Huffman coding, run-length coding

1.1 图像压缩的意义

1.2 JPEG图像压缩的国际标准

JPEG-LS[2]（JPEG-Lossless）标准是JPEG组织在1997年制定的连续色度（Continuous-tone）图像的无损压缩标准，它的无损压缩效果与JPEG2000相当，但算法相对简单。它的压缩原理也是基于预测，误差编码，但它的预测器要比JPEG中的复杂，并根据预测误差符合双边几何分布（Two-sided geometric distribution）的推论对误差进行修正，同时它对即将编码的像素的背景（Context）也进行建模以提高预测精度。

1.3 本论文的研究内容

1.JPEG图像压缩意义和现状.

2.JPEG压缩方法的原理及实现的具体步骤。

3.通过试验，主要观察JPEG有损压缩方法对图像的压缩效果。

4.哈夫曼编码是种常用的熵编码方法，论文中分析了它的原理和在图像压缩中应用。

2.1 JPEG图像压缩技术

2.2 JPEG压缩中图像文件的格式

2.2.1 BMP图像的格式

BMP图像采用RGB（Red Green Blue）色彩模型，将各种颜色视为为红，绿，蓝（R，G，B）三个部分的组合。由于一幅图像中许多像素对应的颜色是相同的，BMP图像中采用了一个表：表中的每一行记录一种颜色的R，G，B值。这样，当表示一个象素的颜色时，只需要指出该颜色是在第几行，即该颜色在表中的索引值，这个表在BMP图像中称为调色板。有一种图，它的颜色数高达256×256×256种，也就是说包含上述提到的R，G，B颜色表示方法中所有的颜色，这种图叫做真彩色图(True Color)。真彩色图并不是说一幅图包含了所有的颜色，而是说它具有显示所有颜色的能力，即最多可以包含所有的颜色。表示真彩色图时，每个象素直接用R，G，B三个分量字节表示，而不采用调色板技术。

a） 信息头的前24个字节

b） 信息头的后16个字节

（2-1）

1)每一行的字节数必须是4的整倍数，如果不是，则需要补齐。这在前面介绍biSizeImage时已经提到了。

2)一般来说，BMP文件的数据从下到上，从左到右的。也就是说，从文件中最先读到的是图像最下面一行的左边第一个像素，然后是左边第二个像素…接下来是倒数第二行左边第一个像素，左边第二个像素…依次类推，最后得到的是最上面一行的最后一个像素。

2.2.2 JPEG图像格式

JPEG文件大体上可以分成以下两个部分[7]：标记码(Tag)加压缩数据。先介绍标记码部分。标记码部分给出了JPEG图像的所有信息(有点类似于BMP中的头信息，但要复杂的多)，如图像的宽、高、Huffman表、量化表等等。标记码有很多，但绝大多数的JPEG文件只包含几种。标记码的结构为：

SOI

DQT

DRI

SOF0

DHT

SOS

EOI

2.3 本章小结

3.1 JPEG图像压缩编码方法

3.1.1 哈夫曼编码的原理

3.1.2 哈夫曼编码在图像压缩中的实现

bits[17] = { 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };

huffval[] ={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

0 2 00

1 3 010

2 3 011

3 3 100

4 3 101

5 3 110

6 4 1110

7 5 11110

8 6 111110

9 7 1111110

10 8 11111110

11

9

111111110

int p,l,i,lastp;

p = 0;

for (l = 1; l <= 16; l++) {

i = bits[l];

while (i–)

huffsize[p++] = l;

}

huffsize[p] = 0; /*使huffsize[]最后一个元素为零，是为了后面生成huffcode[]时，能够跳出循环*/

lastp=p; /* lastp-1即是所有码值的个数，后面的程序要用到它*/

{ int code,si;

code = 0;

si = huffsize[0];

p = 0;

while (huffsize[p]) {

while ( huffsize[p] == si) {

huffcode[p++] = code;

code++;

}

code <<= 1;

si++;

}

}

for (p = 0; p < lastp; p++) {

i = huffval[p];

ehufco[i] = huffcode[p];

ehufsi[i] = huffsize[p];

}

3.2 JPEG图像压缩原理

JPEG的压缩原理其实是前面介绍的那些原理的综合，博采众家之长，这也正是JPEG有高压缩比的原因。其编码器的流程如图3-2：

3.2.1 前项DCT变换

JPEG 里, 要对数据压缩, 先要做一次前向DCT（Forward cosine transform FDCT)变换，一次只对一个块（Block）进行变换。将原始图像数据视为空间的函数f(x,y),x为像素所处的行，y为像素所处的列，u和v对应频域空间的行和列，前向DCT变换的公式如式(3-1)，DCT反变换的公式如式（3-2）。

（3-1）

（3-2）

1)FDCT是对每 8×8个点为一个单位处理的。所以如果原始图片的宽度(Width)或高度（Height）不是 8 的整倍数, 都需要先补成 8的倍数, 好一块一块的处理。例如某幅图像为698×695(高度×宽度)，高度，宽度均不是8的整数倍，这在对图像压缩时，图像的右边应再加一列，图像的底部应再加6行，这样图像变为704×696，对于多加的行和列的像素值取为0即可。

2)FDCT变换前，先要将原始图像数据零均值化，如果原始图像的精度为P，则应将数值从[0,2p-1]变换到[-2p-1，2p-1-1]，显然将原始数据减去2p-1即可。对于关心的8位的灰度图像，减去128，数据范围为[-27,27-1]。

3.2.2 量化

（3-3）

（3-4）

RoundInteger 顾名思义是对数值取整，四舍五入就行了。

JPEG标准中推荐的量化表如表3-4。依据心理视觉阀制作，对 8bit 的亮度和色度的图像的处理效果不错，当然可以使用任意的量化表。

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,

24, 35, 55, 64, 81, 104, 113, 92,

49, 64, 78, 87, 103, 121, 120, 101,

72, 92, 95, 98, 112, 100, 103, 99

3.2.3 使用哈夫曼可变字长编码器对量化系数进行编码

Symbol-1 Symbol-2

(SIZE) (AMPLITUDE)

DIFF=DCi-DCi-1

symbol-1是DIFF的有效位数（以二进制来计算），记为SIZE。如果DIFF为3，则symbol-1应为2。由于计算机中将负数存为反码或补码的形式，当DIFF为负数时，DIFF的有效位数为（-DIFF）的有效位数。前面提到，经过FDCT和量化两个环节后，对于8位

symbol-2是DIFF的幅值，记为AMPLITUDE，如果DIFF=3，则symbol-2为3。

symbol-1 symbol-2

(RUNLENGTH,SIZE) (AMPLITUDE)

symbol-1包含RUNLENGTH，SIZE两部分。RUNLENGTH代表某一非零AC系数前面连续的AC系数为零的个数，这是对为零的AC系数进行游程编码。SIZE代表非零AC系数的有效位数。这里要注意，symbol-1的长度是固定的，占8位，RUNLENGTH，SIZE各占4位，故RUNLENGTH最大值为15，它最多可以记录15个连续的为零的系数。在symbol-1后面，往往有symbol-2，但在两种情况下没有：1）连续为零的系数大于15。此时，要用多个symbol-1来完成游程编码，symbol-1为（15，0）时，表示有16个连续的零系数，因为AC系数有63个，故在symbol-1完成游程编码时最多有3个连续的（15，0）；2）当一窜连续为零的系数包含最后的AC系数 。这时以标记（0,0）表示后面的系数全为零，此块（Block）的数据结束，（0,0）一般称为EOB(End of block)。symbol-2表示非零系数的数值。

15 0 -1 0 0 0 0 0

-2 0 0 0 0 0 0 0

-1 -1 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

15 0 -2 -1 -1 -1 0 0 -1 0 ???? 0

(2)(3), (1,2)(-2), (0,1)(-1), (0,1)(-1), (0,1)(-1), (2,1)(-1), (0,0)

(0,0) 1010

(0,1) 00

(1,2) 11011

(2,1) 11100

(3) 11

(-2) 01 （为-2的反码）

(-1) 0

0111111011010000000001110001010

3.3 本章小结

4.1 总体设计

4.1.1设计思想

4.1.2 模块设计

1.BMP图像文件的读取和JPEG图像文件的存储

2.正向离散余弦变换

3.量化

4.Z形编排

5.直流系数的编码

8*8图像块经过DCT变换之后得到的DC直流系数有两个特点：一是系数的数值比较大，二是相邻8*8图像块的DC系数数值变化不大。根据这个特点，算法使用了差分脉冲编码调制(DPCM)技术，对相邻图像块之间的DC系数的差值进行编码。

6.交流系数的编码

7.熵编码

8.组成位数据流

JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据，这样做的目的是为了便于传输、存储和译码器进行译码，这样的组织的数据通常称为JPEG位数据流（JPEG bitstream）

4.2 JPEG图像压缩软件的实现

4.2.1 BMP图像的读入、显示模块

BOOL SaveFile(const char* paszFilename); //存储BMP位图文件

Char* GetFileName(); //返回位图文件名

DWORD GetSize(); //返回位图文件的大小

UINT GetWidth(); //返回位图文件的宽度

UINT GetHeight(); //返回位图文件的高度

UINT GetNumberofCorlors(); //返回位图颜色数目

BITMAPINFO* GetInfo(); //返回图像信息结构首地址

BYTE *GetData(); //返回图像数据首地址

BMP图的读取流程图如图4-2所示。

BOOL CDib::Save(const char *pszFilename)

{

//如果没有数据,不能保存

if(m_pDib==NULL)

return(FALSE);

CFile cf;

if(!cf.Open(pszFilename,CFile::modeCreate|CFile::modeWrite))

return(FALSE);

BFH.bfType=’MB’;

// 写具体数据到指定文件

cf.Write(m_pDib,m_dwDibSize);

return(TRUE);

}

4.2.2 DCT量化编码模块

JPEG标准中规定了4种压缩模式[15]：顺序编码（Sequential encoding），渐进编码（Progressive encoding），等级编码（Hierarchical encoding），无损编码（Lossless encoding）。应用最为广泛的为基于DCT变换的顺序编码，也称之为基准模式(Baseline mode)，其它几种模式都以此为基础。这里，采用了JPEG基准模式对图像进行压缩，在基准模式中，熵编码采用哈夫曼编码方法。

int quant_val[64];

for(i=0;i<64;i++)

{

if(Light[i]>=0)

quant_val[i]=(int)(Light[i]/QuantTable[i]+0.5);

else

quant_val[i]=(int)(Light[i]/QuantTable[i]-0.5);

}

for(i=0;i<64;i++)

table[zig[i]]=quant_val[i];

delete Light;

15 0 -1 0 0 0 0 0

-2 -1 0 0 0 0 0 0

-1 -1 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

Size Amplitude

0 0

1 -1,1

2 -3,-2,2,3

3 -7~-4，4~7

4 -15~-8，8~15

5 -31~-16，16~31

6 -63~-32，32~63

7 -127~-64，64~127

8 -255~-128，128~255

9 -511~-256，256~511

10 -1023~512，512~1023

11 -2047~-1024，1024~2047

Size Amplitude

1 -1,1

2 -3,-2,2,3

3 -7~-4，4~7

4 -15~-8，8~15

5 -31~-16，16~31

6 -63~-32，32~63

7 -127~-64，64~127

8 -255~-128，128~255

9 -511~-256，256~511

10 -1023~512，512~1023

(DC)(2)(3),(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0)

……

4.2.3 组成位数据流模块

void CDib::ShiftWrite(int huffmanbitnum,int huffmancode)

{

int i,j,k;

if(huffmanbitnum

{

EncodeJpeg=EncodeJpeg|(huffmancode<<(surplus-huffmanbitnum));//需要编码的码串移入数据缓冲区

surplus=surplus-huffmanbitnum; //当前数据缓冲区剩余的位数

}

else//需要编码的码串比数据缓冲区剩余的位多，截断码串分两次移入数据缓冲区，使EncodeJpeg=32之后写入文件

{

i=huffmanbitnum-surplus; //截断码串后第二次移入数据缓冲区的位长

j=(int)pow(2,surplus)-1; //得到从低位到高位surplus个1,即(000111…11)

EncodeJpeg=EncodeJpeg|((huffmancode&(j<>i);

Write32bit(); //32位数据缓冲区填满后写入JPEG文件

EncodeJpeg=0; //数据缓冲区清零

k=(int)pow(2,i)-1; //

EncodeJpeg=(huffmancode&k)<<(32-i); //使被截断后剩余的码串移到32位数据缓冲区的高位

surplus=32-i; //目前数据缓冲区剩余的位数

}

}

4.2.4 JPEG图像存储模块

4.2.5 解压缩模块

4.3 软件应用

4.4 压缩效果的评价

4.4.1 压缩效果理论分析

（4-1）

f(m,n)为原始图像第m行，第n列像素值；

M，N为图像的总行数和总列数。 一般来说，PSNR在30db以上时，效果较好。它反映了原图像与恢复图像的差别。而主观评价参数为压缩比，表示为压缩前图像文件的大小/压缩后图像文件的大小。另外，这里给出了单个像素差值的最大值作为一种参考，由于一幅图像的像素数从几万到几百万不等，一个像素恢复的效果较差对整个图像来说并不重要，但显然它越小越好。同时给出所有像素差值的平均值。因为图像大部分是拿来给人看的，而人的视觉机理很难用数学模型表达出来，更不用说用某一个参数来衡量，所以由人来观察图像，并给出评价是必要的。评价分为很好，好，较好，一般，较差，很差6个等级。对图像进行JPEG压缩，量化表的生成是在JPEG标准推荐的量化表的基础上进行线形放大，缩小。量化表的选取直接关系到整幅图像压缩的效果及压缩比，将图像质量Quality预先定义在1～100，当取100时，量化表的值均是1，压缩后的图像在量化环节没有信息损失，当取75时采用的量化表是JPEG标准推荐的量化表中的值均除以2，当取50时采用的量化表是JPEG标准推荐的量化表，当取35时采用的量化表是JPEG标准推荐的量化表中的值均扩大1.4倍。当取1时采用的量化表是JPEG标准推荐的量化表中的值均扩大50倍。压缩比也可用每像素平均占用的位（Bit）来表示，它越小，压缩比越小。

4.4.2 压缩效果实际分析

Quality值 压缩前大小 压缩后大小

100 1.36MB 419KB 2.96 很好

75 1.36MB 93.7KB 14.86 很好

50 1.36MB 64.6KB 21.56 好

35 1.36MB 53.0KB 26.28 较好

1 1.36MB 12.5KB 114.11 很差

Quality值

100 1.38MB 441KB 3.20 很好

75 1.38MB 98.2KB 14.39 好

50 1.38MB 67.5KB 20.94 较好

35 1.38MB 55.5KB 25.6 一般

1 1.38MB 12.9KB 109.55 很差

4.5 本章小结

5.1 JPEG图像压缩结论

JPEG格式是应用最广泛的图片格式之一，它采用一种特殊的有损压缩算法，将不易被人眼察觉的图像颜色删除，从而能够将图像压缩在很小的储存空间，由于图像中重复或不重要的资料会被丢失，因此也会造成图像数据的损伤。但是JPEG压缩技术十分先进，它用有损压缩方式去除冗余的图像数据，在获得极高的压缩率的同时能展现十分丰富生动的图像，换句话说，就是可以用最少的磁盘空间得到较好的图像品质。而且JPEG是一种很灵活的格式，具有调节图像质量的功能，允许用不同的压缩比例对文件进行压缩，支持多种压缩级别，压缩比率通常在10∶1 到40∶1 之间。因此使得JPEG在短短的几年内就获得极大的成功，目前网站上百分之八十的图像都是采用JPEG的压缩标准。但是随著多媒体应用领域的激增，传统JPEG压缩技术已无法满足人们对多媒体图像资料的要求。因此，更高压缩率以及更多新功能的新一代静态图像压缩技术必定要取代现有的技术。在压缩之前，我们这里试图将图像压缩为原来的1/4，也就是2Bits/pixel，为达到这个目的，进行了下面这些研究：

1)论文先对在数据压缩中常用的哈夫曼编码和算术编码的原理及在图像压缩中的应用进行了阐述。

2)论文中采用JPEG算法对图像进行压缩。采用不同的量化表对压缩比和压缩效果进行了观察，试验表明，把JPEG标准推荐的量化表中的数值均除以2并以此为量化表，已经可以将图像压缩到2Bits/pixel以下。

1)论文中JPEG算法采用的量化表是以JPEG标准中推荐的量化表为基础，在日后的研究中，可以尝试使用对图像更为适合的量化表，并可以尝试采用向量量化方法，这样，应该可以得到更好的压缩效果。

2)论文中没有对JPEG无损算法进行研究，相信无损压缩的效果要大大好于有损压缩，毕竟它可以对压缩前后图像的单个像素最大差值进行控制。

5.2 JPEG图像压缩前景分析

JPEG2000的优点：1、JPEG2000 作为JPEG升级版，高压缩（低码率）是其目标，其压缩率比 JPEG 高约 30% 左右。2、JPEG2000 同时支持有损和无损压缩，而 JPEG 只能支持有损压缩。因此它适合保存重要图片。3、JPEG2000 能实现渐进传输，这JPEG2000的一个极其重要的特征。这也就是我们对 GIF 格式图像常说的”渐现”特性。它先传输图像的轮廓，然后逐步传输数据，不断提高图像质量，让图像由朦胧到清晰显示，而不必是像现在的 JPEG 一样，由上到下慢慢显示。4、JPEG2000 支持所谓的”感兴趣区域”特性，你可以任意指定图像上你感兴趣区域的压缩质量，还可以选择指定的部份先解压缩。这样我们就可以很方便的突出重点了。JPEG2000的应用：JPEG 2000的应用领域可概略分成两部分，一为传统JPEG的市场，像打印机，扫描仪，数码相机等，一为新兴应用领域，像网网络传输，无线通讯，医疗图像等。目前对 JPEG 2000 热情最大的是那些数字照相机厂商。JPEG 2000和JPEG 相比优势明显，且向下兼容，取代传统的JPEG格式指日可待。

[1] 吴乐南.数据压缩[M].电子工业出版社.2000. 1～3.

[2] 张益贞.Visual C++实现MPEG/JPEG 编解码技术[M].人民邮电出版社.2002.113～116

[3] 刘玮，王红星. 图像的无损压缩编码方法及JPEG标准模式[J]. 现代电子技术.

2002.5:7～10

[4] 严剑. Huffman算法及其在数据压缩中的应用[J]. 计算机与现代化. 1996, 48:15～20

[5] 5VK Goyal.Theoretical Foundations of Transform Coding[J].IEEE Signal

Processing Mag.2001，18:9～21

[6] 阮秋琦. 数字图像处理学[M]. 电子工业出版社.2001.235～237

[7] 许刚,廖斌,李承毅.JPEG图象文件格式分析[J].计算机系统应用.1998,10:37～39

[8] 孙即祥.图像压缩与投影重建[M].科学出版社.2005.15～20

[9] 马志荣,普杰信,赵渝青.ＪＰＥＧ软件压缩的实现与改进[J].计算机工程与应用. 1998, 8:39～41

[10] 龚华,刘雪松,张奎刚.JPEG标准格式的编码方法[J]. 微处理机. 2002, 1:39～40

[11] 祝宁,叶念渝.JPEG图象文件格式的分析及应用[J].电脑与信息技术.1999,3:21～24

[12] 智艾娣,智西湖.在JEPG压缩算法中选择量化表的尝试[J].小型微型计算机系统. 1997, 09:73～76

[13] 黄战华, 蔡怀宇, 李贺桥, 黄孟怀.自适应量化表的JPEG压缩技术[J].光电子激光.2000,20: 92～96

[14] 林福宗.多媒体技术基础[M].清华大学出版社.2002.73-77

[15] 贾铸.算术编码方法在图像压缩编码中的应用[J]. 电视技术. 1999, 209:8～11

• 7
点赞
• 2
评论
• 2
收藏
• 打赏
• 扫一扫，分享海报

03-17

05-01 1298
11-18 3万+
03-23 1万+
01-08 2万+
04-03 1158
07-19 236
12-03 1万+
09-23 1626
04-17 3633
11-20 3261
07-28 2526

johnny710vip

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。