第8章 DCT与JPEG编码 JPEG(Joint Photographic Experts Group联合图象专家组)是(ITU的前身)国际电话与电报咨询委员会CCITT与ISO于1986年联合成立的一个小组,负责制定静态图像的编码标准 1992年9月JPEG推出了ISO/IEC 10918标准(CCITT T.81)——连续色调静态图像的数字压缩与编码,简称为JPEG标准,适用于灰度图与真彩图的静态图像的压缩 2000年12月JPEG在JBIG(Joint Bi-level Image experts Group联合二值图像专家组)的帮助下又推出了比JPEG标准的压缩率更高、性能更优越的JPEG 2000标准ISO/IEC 15444 (ITU T.800[2002年8月])——JPEG 2000图像编码系统,适用于二值图、灰度图、伪彩图和真彩图的静态图像压缩 JPEG主要采用了以DCT为基础的有损压缩算法,在本章中会作较为详细的介绍。而JPEG 2000则采用的是性能更优秀的小波变换,将在下一章介绍 由于视频的帧内编码就是静态图像的编码,所以JPEG和JPEG 2000的算法也用于MPEG的视频编码标准中
8.1 DCT 与上一章所讲的几种熵编码不同,DCT是一种变换编码,使用十分广泛,也是JPEG编码中的一种基础算法 DCT = Discrete Cosine Transform = 离散余弦变换
Fourier级数与余弦变换 若函数f (x)以2 l为周期,在[-l, l ]上绝对可积,则f (x)可展开成Fourier级数: 其中
余弦级数 若f (x)为奇或偶函数,有 an≡0或bn≡0,则f (x)可展开为正弦或余弦级数: 任给f (x),x∈[0, l ],总可以将其偶延拓到[-l, l ],然后再以2l为周期进行周期延拓,使其成为以2l为周期的偶函数,从而可以展成余弦级数
连续余弦变换 f (x)展成余弦级数: 其中展开式系数的计算式: 称为f (x)的正(连续)余弦变换 展开式(余弦级数)本身称为an的反余弦变换
一维离散余弦变换 将只在N个整数采样点上取值得离散函数f (x),x = 0, 1, 2, ..., N -1偶延拓到2N个点: 则f (-1) = f (0),函数对称于点x = -1/2
将f (x)平移-1/2,区间的半径 l = N: 再以2N为周期进行周期延拓,可得:
为了使IDCT中的a0能写入和式,引入函数 为了使正反变换对称,将 拆开后分别乘在正反变换中,并改记an 为F(n)、n为u、x为i,则前式变为:
二维离散余弦变换 设二维离散函数f (i, j),i, j = 0, 1, 2, ... , N-1,与一维类似地延拓,可得二维DCT:
8.2 JPEG编码 1986年国际电话与电报咨询委员会CCITT与国际标准化组织ISO成立联合图象专家组(JPEG = Joint Photographic Experts Group) 1992年9月18日通过了适用于灰度图与真彩图的静态图像压缩标准:Digital compression and coding of continuous-tone still images(连续色调静态图像的数字压缩与编码)(CCITT T.81,ISO/IEC 10918),简称为JPEG标准(参见网站www.jpeg.org)
JPEG标准的组成部分 ISO/IEC 10918-1:1994:Requirements and guidelines(需求与指导方针) ISO/IEC 10918-2:1995:Compliance testing(一致测试) ISO/IEC 10918-3:1997:Extensions(扩展) ISO/IEC 10918-3:1997/Amd 1:1999:Provisions to allow registration of new compression types and versions in the SPIFF header(可供在SPIFF头中注册新压缩类型和版本) ISO/IEC 10918-4:1999:Registration of JPEG profiles, SPIFF profiles, SPIFF tags, SPIFF colour spaces, APPn markers, SPIFF compression types and Registration Authorities (REGAUT)(注册JPEG简表、SPIFF简表、SPIFF标签、SPIFF颜色空间、APPn标记、SPIFF压缩类型和注册权限)
JPEG采用的压缩算法与编码模式 JPEG专家组开发了两种基本的压缩算法: 在JPEG标准中定义了四种编码模式: 采用以DCT为基础的有损压缩算法 采用以预测技术为基础的无损压缩算法 在JPEG标准中定义了四种编码模式: 无损模式:基于DPCM 基准模式:基于DCT,一遍扫描 递进模式:基于DCT,从粗到细多遍扫描 层次模式:含多种分辨率的图(2n倍)
JPEG四种编码模式的关系图 本节只介绍基于DCT有损压缩算法的基准(baseline)模式中的顺序(sequential)处理所对应的算法和格式,其熵编码只使用Huffman编码 而在扩展的基于DCT或无损压缩算法中,既可以使用Huffman编码,又可以使用算术编码
JPEG图像的压缩比与质量 JPEG在使用DCT进行有损压缩时,压缩比可调整 在压缩10~30倍后,图像效果仍然不错,因此得到了广泛的应用
一、JPEG压缩的算法概要 JPEG压缩是有损压缩,它利用了人的视觉系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。JPEG属于结合变换编码(DCT)与熵编码(RLE/Huffman)的混合编码 JPEG算法与彩色空间无关,因此“RGB到YUV变换”和“YUV到RGB变换”不包含在JPEG算法中。JPEG算法处理的彩色图像是单独的彩色分量图像,因此它可以压缩来自不同彩色空间的数据,如RGB, YCbCr和CMYK
JPEG编码步骤 压缩编码大致分成三个步骤: (1) 使用正向DCT(FDCT = forward DCT)把空间域表示的图变换成频率域表示的图。 (2) 使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的。 (3) 使用Huffman可变字长编码器对量化系数进行编码 译码/解压缩的过程与压缩编码过程正好相反
JPEG压缩编码-解压缩算法框图
二、JPEG压缩编码算法的 主要计算步骤 (0) 8*8分块 (1) 正向离散余弦变换(FDCT) (2) 量化(quantization) (3) Z字形编码(zigzag scan) (4) 使用差分脉冲编码调制DPCM对直流系数DC(direct current)进行编码 (5) 使用行程长度编码RLE对交流系数AC (alternating current)进行编码 (6) 熵编码(Huffman/算术)
1. FDCT 下面对正向离散余弦变换(FDCT)变换作几点说明。
(2) DCT变换使用下式计算, 其中 ,f(i,j) = v(i,j) – 128 并称 为直流 系数DC,其他F(u , v)为交流系数AC
逆变换IDCT使用下式计算: (3) 在计算两维的DCT变换时,可使用下面的计算式把两维的DCT变换变成两次一维的DCT变换
两维DCT变换方法
2. 量化 量化指对经过FDCT变换后的频率系数进行量化 量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目 量化是图像质量下降的最主要原因 对于有损压缩算法,JPEG算法使用如下图所示的线性(均匀)量化器进行量化 量化步距是按照系数所在的位置和每种颜色分量的色调值来确定
量化表 因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化表和色差量化表 此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此表中的左上角的量化步距要比右下角的量化步距小 这两个表中的数值对CCIR 601标准电视图像已经是最佳的。如果不使用这两种表,你也可以用自己的量化表替换它们
色度量化值 亮度量化值 16 11 10 24 40 51 61 17 18 47 99 12 14 19 26 58 60 55 21 66 13 57 69 56 22 29 87 80 62 37 68 109 103 77 35 64 81 104 113 92 49 78 121 120 101 72 95 98 112 100
量化结果的计算 可以用下式计算量化值: 其中,Sq(u,v)为量化后的结果、F(u,v)为DCT系数、Q(u,v)为量化表中的数值
3. Z字形编排 量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排
量化DCT系数的序号 经Z字形排列后,DCT系数的序号如下图所示,这样就把一个二维的8×8矩阵变成了一个一维的1× 64矢量,频率较低的系数放在矢量的顶部 1 5 6 14 15 27 28 2 4 7 13 16 26 29 42 3 8 12 17 25 30 41 43 9 11 18 24 31 40 44 53 10 19 23 32 39 45 52 54 20 22 33 38 46 51 55 60 21 34 37 47 50 56 59 61 35 36 48 49 57 58 62 63
4. 直流系数的编码 8×8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大 根据这些特点,JPEG算法使用了差分脉冲编码调制(DPCM)技术,对相邻图像块之间的DC系数的差值(Delta)进行编码: Delta = DC(0, 0)k - DC(0, 0)k-1
5. 交流系数的编码 量化AC系数的特点是1×63矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码 JPEG使用了1个字节的高4位来表示连续“0”的个数,而使用它的低4位来表示编码下一个非“0”系数所需要的位数,跟在它后面的是非0量化AC系数的数值
6. 熵编码 JPEG对DPCM编码后的直流DC系数和RLE编码后的交流AC系数使用熵编码作进一步的压缩 在JPEG有损压缩算法中,使用Huffman编码器来减少熵。使用Huffman编码器的理由是可以使用很简单的查表(lookup table)方法进行编码 压缩数据符号时,Huffman编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的Huffman码表可以事先进行定义
DC码表符号举例 若DC的值(Value)为4,符号SSS用于表达实际值所需要的位数,实际位数就等于3
JPEG标准提供的亮度DC系数差的Huffman编码表
JPEG标准提供的色差DC系数差的Huffman编码表
JPEG标准提供的亮度AC系数的Huffman编码表的开始部分
JPEG标准提供的色差AC系数的Huffman编码表的开始部分
7.组成位数据流 JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据,这样做的目的是为了便于传输、存储和译码器进行译码 这样的组织的数据通常称为JPEG位数据流(JPEG bitstream)
三、应用JPEG算法举例 源图像数据 FDCT系数
量化表 标准量化系数
解标准量化系数 重构图像数据
8.3 JPEG文件格式 JPEG在制定JPEG标准时,虽然定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但并没有具体定义明确的JPEG文件格式 C-Cube Microsystems公司的Eric Hamilton于1992.9.1所定义的JFIF(JPEG File Interchange Format JPEG文件交换格式) 1.02成为JPEG文件(*.JPG)的事实标准 下面只介绍JPEG的基准模式(Baseline DCT)下的JFIF格式
一. 图像准备 1. 分组元 灰度图:一个组元 真彩图:三个组元 RGB——等分辨率 YCrCb——不等分辨率:4:2:2或4:1:1 JPEG文件使用的颜色空间是1982年推荐的电视图像信号数字化标准CCIR 601(现改为ITU-R BT.601)。在这个彩色空间中,每个分量、每个像素的电平规定为256级,用8位代码表示 可使用前面介绍过的公式,在RGB空间与YCbCr空间之间相互转换 2. 分块 一般分成8*8的块,不足的部分补边缘像素
二. 文件格式框架 JFIF格式的JPEG文件以<图象开始标记>开始 接着是若干可选的存放商业公司信息或应用软件与扩展信息的<应用n标记段> <量化表定义段>也是可选的和可多个的; 对Baseline,一幅图象只有一个帧,所以只有一个描写具体图像参数的<帧参数段>,而一帧只有一个记录Huffman表序号与频率分量信息的<扫描参数段> 一个可包含若干Huffman表说明的<Huffman表定义段>是可选的 图像的压缩数据存放在一系列由若干8*8的数据块组成的MCU(Minimum Data Unit最小数据单元)中 文件最后以<图象结束标记>结束
即: <图象开始标记> <应用0标记段> <[应用n标记段]...> <[量化表定义段]...> <帧参数段> <[Huffman表定义段]> <扫描参数段> <压缩数据> <图象结束标记>
三. 文件格式内容 注:多字节无符号整数的高位字节在前(与Intel CPU不同) 图象开始标记:0xff, SOI(0xd8) 应用0标记段(APP0 marker segment): 应用0标记:0xff, APP0(0xe0) 段长度:2B(无符号整数,长度从本字段开始计算,下同) 标识符:5B:"JFIF\0" 版本:2B:主版本号(1B,=1), 次版本号(1B,≤2) 密度单位:1B(=0:X与Y的密度表示X与Y的象素形状比,=1:点数/英寸,=2:点数/厘米) X方向象素密度:2B(无符号整数) Y方向象素密度:2B(无符号整数)
[应用n标记段]:(可选,可若干段) [量化表定义段]:(可选,可若干段) 略图水平象素数(Xthumbnail):1B 略图垂直象素数(Ythumbnail):1B [略图(thumbnail)]:3*Xthumbnail*Ythumbnail B(若Xthumbnail=Ythumbnail=0 则无略图) [应用n标记段]:(可选,可若干段) 应用n标记:0xff, APPn(0xen) (n=0~15) 段长度:2B(无符号整数) 段内容:(段长度-2)B [量化表定义段]:(可选,可若干段) 定义量化表标记:0xff, DQT(0xdb) 量化表说明:(可若干个,一般只一个) 量化表精度与序号:1B 精度Pm:高4位,=0(8b), 1(16b), Baseline=0 序号Nm:低4位,=0,1,2,3 量化表:64*(Pm+1) B(Z字形排序)
帧参数段:(对Baseline,一幅图象只有一个帧) 帧开始标记:0xff, SOF0(0xc0) (Baseline DCT帧) 段长度:2B(无符号整数) 数据精度:1B(位数/象素/颜色分量,为输入数据的位数,Baseline=8) 图象高:2B(无符号整数,光栅行数,不包含为得整数个MCU而对底边的复制行,若=0则行数由第一个扫描(scan)末尾的DNL标记(0xff, 0xdc)确定) 图象宽:2B(无符号整数,光栅行内的象素数,不包含为得整数个MCU而对最右列的复制列) 颜色分量说明: 分量数NC:1B 第k个分量:(k=1~NC, 共NC个) 标识:1B 相对亚采样率:1B (高4位=水平采样率Hk; 低4位=垂直采样率Vk; 都可=0,1,2,3) 量化表序号Qk:1B (DCT=0,1,2,3; DPCM=0) (如对缺省YCbCr:NC=3, Y:ID1=0, (H1,V1)=0x22, Q1=0; Cb:ID2=1,(H2,V2)=0x11, Q2=1; Cr:ID3=2, (H3,V3)=0x11, Q3=1)
扫描参数段:(对Baseline,一帧只有一个扫描段) [Huffman表定义段]:(可选) 定义Huffman表标记:0xff, DHT(0xc4) 段长度:2B(无符号整数) Huffman表说明:(可若干个) 表类型与序号:1B (类型:高4位, =0(DC), 1(AC); 序号:低4位, =0,1,2,3, Baseline只允许取0,1) 位表:16B(L1~L16, Lk=长度为k位的Huffman码字的个数) 值表:∑Lk B(V[k,i]=第i个长度为k位的码值) 扫描参数段:(对Baseline,一帧只有一个扫描段) 扫描开始标记:0xff, SOS(0xda) 扫描分量说明: 分量数NS:1B(≤NC) 第k个分量:(k=1~NS, 共NS个) 标识:1B(∈帧参数段的{IDk}) Huffman表序号:1B(DC:高4位, =0,1,2,3; AC:低4位, =0,1,2,3; Baseline都只允许取0,1) 频率选择起点:1B(对顺序编码[如Baseline]为0)
压缩数据: 图象结束标记:0xff, EOI(0xd9) 频率选择终点:1B(对顺序编码[如Baseline]可为0[只含DCT系数]或63[0x3f]) 逐渐逼近位位置:1B(对顺序编码[如Baseline]为0) 压缩数据: 由若干MCU(Minimum Data Unit, 最小数据单元)组成 图象被从上到下、从左到右划分成若干MCU,若图象的高和宽不是MCU的整数倍,则对图象的底边和最右列进行复制 对只有一个颜色分量的灰度图,一个MCU为一个8*8的数据块,对应于图象中的一个8*8象素阵列 对有三个颜色分量的彩色图,一个MCU由若干8*8的数据块组成,块的顺序和数目由扫描内的亚抽样比率决定 应忽略编码中0xff后的0x00 图象结束标记:0xff, EOI(0xd9)
四. 文件一般顺序 JITF格式的JPEG文件(*.jpg)的一般顺序为: 0xFF SOI(0xD8) 0xFF APP0(0xE0) 段长 图象参数 [若干应用段:0xFF APPn(0xEn) 段长 应用说明] 0xFF DQT(0xDB) 段长 量化表说明 0xFF SOF0(0xC0) 段长 帧参数 0xFF DHT(0xC4) 段长 Huffman表说明 0xFF SOS(0xDA) 段长 扫描参数 压缩数据 0xFF EOI(0xD9)
作业 1. (必做)编写一段程序实现JPEG算法中的8*8的二维DCT变换、量化、逆量化和逆二维DCT变换。 具体要求:逐个读入下页的4个8*8的十六进制整数串(为灰度图lena.bmp中的一个16*16像素块 ),量化采用标准亮度量化表,输出内容(ASCII码)同前例(原始数据、变换后的数据、量化后的数据、逆量化的数据和反变换的数据)
2.(大作业4)实现JPEG算法的编解码,读写并显示JPG文件及BMP和GIF文件,实现这几种文件格式的相互转换。
复习思考题 DCT的英文原文与中文译文各是什么?它与三角级数有什么关系?讲稿中它被用在什么地方? JPEG采用了哪些压缩算法与编码模式?我们所讲的是其中的哪一种? 给出JPEG压缩编码算法的主要计算步骤。其中使图像质量下降的是哪一步? DC系数和AC系数的含义是什么?它们各有什么特点? 在JPEG中为什么要进行Z字形编码和RLE编码? 在JPEG中使用了哪些熵编码? 在JPEG中给出了哪几种标准表?
JPEG定义了标准文件格式吗?*.JPG文件使用的是什么格式?