TIFF图像文件格式详解(5)

来源:互联网 发布:淘宝卖洗衣液什么规则 编辑:程序博客网 时间:2024/05/16 05:44

众所周知, JPEG是基于DCT变换的有损压缩图像格式。自从1992年ITU T.81标准创立以来,JPEG已经取得了巨大的成功。JPEG已经成为了现在最流行的图像格式。任何与图像有关的工具系统必须支持JPEG解码甚至编码。虽然它有这样或者那样的缺点, 由于其高压缩率,简单,灵活,以及应用广泛, 到现在为止一直是最流行的图像格式。虽然JPEG2000有很多优点,但丝毫没有撼动JPEG的老大地位。

 

虽然JPEG应用广泛, 但也仅仅限于日常生活中。在有些场合需要无损压缩,这时JPEG就无能为力了,比如医疗图像,Digital Photography中的Raw图像的保存。还好JPEG标准在指定的时候就考虑到了这种情况, 专门预留了无损压缩的格式。后来的ITU T.87完善了无损压缩编码,这就是JPEG-LS或者称为Lossless JPEG。

 

JPEG-LS采用的是预测熵编码。是一种行扫描的编码方式。从这个方面来说,它与JPEG没有任何共同点。不过它所使用的标记(Marker)都定义在JPEG中,所以也不能与JPEG独立开来。要想理解T87,必须得理解T81。

 

1 预测模型

C  B

A  X

X是需要编码的象素,A,B,C是其三个邻域值

选择值      
预测值
0No prediction1A2B3C4A + B – C5A + (B – C)/26B + (A – C)/27(A + B)/2

在预测过程中,所有不存在的值均初始化为0。

 

2 JPEG-LS的编码过程

首先,根据预测方式计算出差分值以及存储该值所需的比特数

然后,根据huffman码表查出该比特数的huffman码字并输出,然后输出对应位数的差分值

 

3 JPEG-LS 码流

以下码流是从一幅JPEG-LS的图像中截取的码流,对照ITU T81可以轻松理解每一个比特所代表的含义

 

FF D8 %SOI(Start Of Image)

 

FF C3 %SOF3

00 0B %长度=11,减去当前的两个字节,紧随之后的是9个字节

10 %比特数

0A 92 %高度=2706

38 60 %宽度= 14432

01 00 11 00

 

FF C4 %DHT

00 24 %长度

00 00 02 01 04 02 03 01 01 01 01 01 00 00 00 00 00 06 07 05 04 08 09 0A 03 0B 01 02 0C 00 0D 0E 0F 10

 

FF DA %SOS

00 08 %长度=8

01 00 00 06 00 00

 

%实际图像数据

FF 00 87 BC 7F 6F 03 F8 7E 7F DC F3 FE 1A A7 F7 4A 7F 86 3F FD B7 5F E2 20 7F 72 17 F8 69 5F DB EB FE 1F 47 F7 2B BF 86 D1 FD D3 2F E1 5E 7F 70 8F F8 93 FF 00 DC 1B FE 1D F7 F7 59 FF 00 84 A1 FD CB 4F E1 7A 7F 70 FB F8 82 5F DC CC FE 18 57 F7 25 BF 86 87 FD D0 4F E1 BD FF 00 6E FF 00 F8 86 BF DC 55 FE 1D 97 F7 15 BF 86 B5 FD C4 2F E1 A1 7F 6C 53 F8 7A 9F D2 4B FE 61 1F F4 37 BF 9C 25 FD 0A 6F 87 EF FB AC FF 00 C4 A3 FE DB EF F1 29 3F AF F5 FC 5F 6F B0 D3 F9 D8 7D AC 7D 00 3F 47 07 42 77 F4 0D BE 3B FF 00 EE D8 FF 00 16 CF FB B7 7F C3 02 FE E3 77 F0 E7 3F B9 C1 FC 2F DF EE 33 7F 0E 7B FB 9C 9F C3 16 FE E1 B7 F1 04 BF B9 85 FC 36 CF EE 3E 7F 0D D3 FB A0 BF C2 82 FE  。。。。。。

 

FF D9 %EOI

 

4 一些细节

4.1 如何选择预测模型?

开始我也为这个问题困惑了很久。如果全局图像都用同一个模型,这几个选择直接有差异吗?后来当我看到对Bayer Pattern的Raw图像进行编码的过程后,终于明白了这几个预测模型的差异和用途。

 

Bayer Pattern的图像如下所示:

BGBGBGBG

GRGRGRGR

BGBGBGBG

GRGRGRGR

BGBGBGBG

GRGRGRGR

BGBGBGBG

GRGRGRGR

只有同一个通道内的预测才有意义,但如果用原始的排列方式来直接编码,就会发现哪种方式都不合适。在处理Raw图像时,通常采用的是把两行合成一行的方法,如下:

BGBGBGBGGRGRGRGR

BGBGBGBGGRGRGRGR

BGBGBGBGGRGRGRGR

BGBGBGBGGRGRGRGR

这样预测模型2,4,6都可以使用。在DNG中一般都使用6。如果是普通的图像,由于每个象素都是同一个通道,所以哪种预测方式都差不多。从这个角度来看,感觉JPEG-LS天生就是为存储Raw图像而设计的。

 

4.2 在数据码流中如何处理FF?

由于X'FF'是marker的预留码字。为了方便的检测marker,在JPEG和JPEG-LS中对X'FF'都做了特殊的处理。在JPEG中, 如果编码出现了FF,而它并不是marker,那么在其之后插一个X'00'。在解码的时候遇到FF00就直接丢掉00。

ITU T87宣称JPEG-LS采用和JPEG不同的处理方式。由于JPEG-LS的marker都>=FF80,也就是说紧随FF的marker的最高位一定是1。如果在编数据码流的时候出现了X'FF',只插一个比特0用来区分X'FF'是数据码流还是marker。如果是0,就丢掉这一比特。

但是,在DNG中的Lossless JPEG仍然采用了JPEG的方式,从DCRAW和DNG SDK的代码中都可以得到验证,很奇怪。

 

 

 

 

原创粉丝点击