JPG文件格式初步认识

来源:互联网 发布:命令与征服 知乎 编辑:程序博客网 时间:2024/04/25 23:00
 优点:
1).照相机几乎都是保存为jpg格式,摄影作品或写实作品支持高级压缩,广泛应用于照相和互联网中。
2)JPEG能提高无损和有损的高压缩比。
3) JPEG一直在不断发展,JPEG 2000的压缩比更高,而且不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。JPEG 2000同时支持有损数据压缩无损数据压缩。另外,JPEG 2000也支持更复杂的渐进式显示和下载。JPEG在互联网中应用还是比较少,但是在医学图像处理领域已经得到比较广泛的应用。
缺点:
 1)压缩想获得高压缩比是有损的,且这种有损是会叠加的。
2)不支持透明度。
3)压缩方案可以很好地压缩类似的色调,但是 JPEG 压缩方案不能很好地处理亮度的强烈差异或处理纯色区域

1.压缩编码算法

JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。具体如下:

压缩算法:

l 有损的离散余弦变换(Discrete Cosine TransformDCT);

l 无损的预测技术压缩。

数据编码方法:

l 哈夫曼编码;

l 算术编码;

编码模式:

l 基于DCT顺序模式:编/解码通过一次扫描完成;

l 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;

l 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;

l 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。

在实际应用中,JPEG图像使用的是离散余弦变换(傅里叶变换的一种,将连续信号函数拆分为多个离散余弦函数积分的组合去掉噪音和实现压缩存储)哈夫曼编码顺序模式

 

JPEG压缩编码算法的主要计算步骤如下:

(0) 8*8分块。

(1) 正向离散余弦变换(FDCT)

(2) 量化(quantization)

(3) Z字形编码(zigzag scan)

(4) 使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。

(5) 使用行程长度编码(RLE)对交流系数(AC)进行编码。

(6) 熵编码(霍夫曼编码)


2.文件格式:
JPG内部存储是块状类型:标志位0xFFE1等 + 本块长度(包含了本块长度和数据字段不包括标志位)+数据

JFIF格式的JPEG文件(*.jpg)块状类型一般顺序为:

SOI(0xFFD8)(图像开始标志,2byte)

APP0(0xFFE0)(X/Y方向像素密度,缩略图像素数,缩略图RGB位图数据

[APPn(0xFFEn)]可选

DQT(0xFFDB)

SOF0(0xFFC0)(帧图像开始,图像宽像素,图像高像素,颜色分量数,量化表)

DHT(0xFFC4)(哈夫曼表)

SOS(0xFFDA)

压缩数据(真正的图像YCrCb图像MCU颜色分量数据)

EOI(0xFFD9)


3.存储方式

内部数据为大端模式存放
压缩数据部分存放的是真正的数据,但一个像素格式不是RGB形式,而是YCbCr的24位形式(JPG中是颜色分量,非YCbCr形式),不包括透明度
压缩数据的存储结构是从上到下,从左到右存放的,但最小单元被划分为了几个块状层次:
数据流à最小编码单元à数据单元与颜色分量

3.1 最小编码单元MCU(Minimum Coded Unit):
查阅标记SOF0,可以得到图像不同颜色分量的采样因子,即YCrCb三个分量各自的水平采样因子和垂直采样因子。
大多图片的采样因子为411111。其中,411即(2*2):(1*1):(1*1));111即(1*1):(1*1):(1*1)。记三个分量中水平采样因子最大值为Hmax,垂直采样因子最大值为Vmax,那么单个MCU矩阵的宽就是Hmax*8像素,高就是Vmax*8像素。

如果,整幅图像的宽度和高度不是MCU宽度和高度的整数倍,那么编码时会用某些数值填充进去,保证解码过程中MCU的完整性(解码完成后,可直接忽视图像宽度和高度外的数据)。

在数据流中,MCU的排列方法是从左到右,从上到下。


3.2 数据单元(数据单元上面是存储的颜色分量,MCU上面也就是存储的颜色分量Y+Cr+Cb):

 每个MCU又分为若干个数据单元。数据单元的大小必定为8*8,所以每个MCU的数据单元个数为Hmax*Vmax

存储类型是一个MCU按照采样因子扫描存储一下(例如Y方向256个Y采样点 + 64个Cr采样点 + 64个Cb采样点),按照每个YCrCb类型的采样点线性分类存储的, 并不是RGB一个个像素存储的

4.解码过程
4.1将二进制编码根据Huffman编码表结合游程编码解码出存储的MCU颜色分量

解码的过程其实就是哈夫曼树的查找过程。

首先查阅标记段SOS中的颜色分量信息,可以得出各个颜色分量对应使用的直流分量和交流分量使用的哈夫曼树编号。一般来说,
Y
分量:直流分量:直流0号哈夫曼树,交流分量:交流0号哈夫曼树;

Cr分量:直流分量:直流1号哈夫曼树,交流分量:交流1号哈夫曼树;

Cb分量:直流分量:直流1号哈夫曼树,交流分量:交流1号哈夫曼树。



4.2 反量化

由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。
在这一过程中,质量因子(精度舍弃位数)的选取至为重要。值选得过大,可以大幅度提高压缩比,但是图像质量就比较差;反之,质量因子越小(最小为1),图像重建质量越好,但是压缩比越低。对此,ISO已经制定了一组供JPEG代码实现者使用的标准量化值。 

不同的颜色分量使用不同的量化表,这个可以从标记段SOF中的颜色分量信息字段查得。一般是Y分量使用量化表0,而CrCb两个分量共同使用量化表1反量化的过程比较简单。只需要对8*8的颜色分量单元的64个值逐一乘以对应的量化表内位置相同的值则可。图像内全部的颜色分量单元都要进行反量化。



4.3 对颜色分量进行反离散余弦变换解压:
文件中的数据是在编码时通过正向离散余弦变换(FDCT)进行时空域向频率域变换而得到的结果,所以现在解码就必须将其反向离散余弦变换(IDCT),就是把颜色分量单元矩阵中的频率域数值向时空域转换。并且,原来的频率域的矩阵大小为8*8,则经过反向离散余弦变换后,时空域的矩阵仍然是8*8

4.4 转换为RGB模式显示:
要在屏幕上显示图像,就必须以RGB模式表示图像的颜色。所以,解码时需要把YCrCb模式向RGB模式转换

由于离散余弦变化要求定义域的对称,所以在编码时把RGB的数值范围从[0255]统一减去128偏移成[-128127]。因此解码时必须为每个分量加上128。具体公式如下:

R=Y                       +1.402*Cb     +128;

G=Y-0.34414*Cr    -0.71414*Cb   +128;

B=Y                       +1.772*Cb     +128;

还有一个问题,通过变换得出的RGB值可能超出了其定义域,所以要作出检查。如果大于255,则截断为255;如果小于0,则截断为0

 

下面补充RGB模式向YCrCb模式的公式:

Y =0.299*R            +0.587*G       +0.114*B    ;

Cr=   -0.1687*R      - 0.3313*G     +0.5*B  +128;

Cb=0.5 *R              - 0.4187*G     - 0.0813*B+128;


参考文档:
http://blog.csdn.net/lpt19832003/article/details/1713718
http://jpeg.org/jpeg2000/index.html

0 0
原创粉丝点击