JPEG 壓縮原理

smilestone322發表於2016-03-01

一、JPEG演算法概要
JPEG(Joint Photographic Experts Group)是一個由ISO和IEC兩個組織機構聯合組成的一個專家組,負責制定靜態的數字影象資料壓縮編碼標準,這個專家組開發的演算法稱為JPEG演算法,並且成為國際上通用的標準,因此又稱為JPEG標準。JPEG是一個適用範圍很廣的靜態影象資料壓縮標準,既可用於灰度影象又可用於彩色影象。
JPEG專家組開發了兩種基本的壓縮演算法,一種是採用以離散餘弦變換(Discrete Cosine Transform,DCT)為基礎的有失真壓縮演算法,另一種是採用以預測技術為基礎的無失真壓縮演算法。使用有失真壓縮演算法時,在壓縮比為25:1的情況下,壓縮後還原得到的影象與原始影象相比較,非影象專家難於找出它們之間的區別,因此得到了廣泛的應用。例如,在VCD和DVD-Video電檢視像壓縮技術中,就使用JPEG的有失真壓縮演算法來取消空間方向上的冗餘資料。為了在保證影象質量的前提下進一步提高壓縮比,近年來JPEG專家組正在制定JPEG2000標準,這個標準中將採用小波變換(Wavelet)演算法。
JPEG壓縮是有失真壓縮,它利用了人的視角系統的特性,使用量化和無失真壓縮編碼相結合來去掉視角的冗餘資訊和資料本身的冗餘資訊。JPEG演算法框圖如圖:


壓縮編碼大致分成三個步驟:
1、使用正向離散餘弦變換(Forward Discrete Cosine Transform,FDCT)把空間域表示的圖變換成頻率域表示的圖。
2、使用加權函式對DCT係數進行量化,這個加權函式對於人的視覺系統是最佳的。

3、使用霍夫曼可變字長編碼器對量化係數進行編碼。


譯碼或者叫做解壓縮的過程與壓縮編碼過程正好相反。

JPEG演算法與彩色空間無關,因此“RGB到YUV變換”和“YUV到RGB變換”不包含在JPEG演算法中。JPEG演算法處理的彩色影象是單獨的彩色分量影象,因此它可以壓縮來自不同彩色空間的資料,如RGB, YCbCr和CMYK。

二、JPEG演算法的主要計算步驟
JPEG壓縮編碼演算法的主要計算步驟如下:
(1)正向離散餘弦變換(FDCT)。
(2)量化(Quantization)。

(3)Z字形編碼(Zigzag Scan)。

(4)使用差分脈衝編碼調製(Differential Pulse Code Modulation,DPCM)對直流係數(DC)進行編碼。

(5)使用行程長度編碼(Run-Length Encoding,RLE)對交流係數(AC)進行編碼。

(6)熵編碼(Entropy Eoding)。


1、正向離散餘弦變換
下面對正向離散餘弦變換(FDCT)變換作幾點說明。
(1)對每個單獨的彩色影象分量,把整個分量影象分成若干個8×8的影象塊,如圖所示,並作為兩維離散餘弦變換DCT的輸入。通過DCT變換,把能量集中在少數幾個係數上。
 

(2)DCT變換使用下式計算:

它的逆變換使用下式計算:

上面兩式中,
C(u),C(v) = (2)-1/2,當u, v = 0;
C(u),C(v) = 1,其他。
f(i, j)經DCT變換之後,F(0,0)是直流係數,其他為交流係數。

 

(3)在計算兩維的DCT變換時,可使用下面的計算式把兩維的DCT變換變成一維的DCT變換:




2、量化
量化是對經過FDCT變換後的頻率係數進行量化。量化的目的是減小非“0”係數的幅度以及

增加“0”值係數的數目。量化是影象質量下降的最主要原因。對於有失真壓縮演算法,JPEG演算法使用如下圖所示的均勻量化器進行量化,量化步距是按照係數所在的位置和每種顏色分量的色調值來確定。因為人眼對亮度訊號比對色差訊號更敏感,因此使用了兩種量化表:亮度量化值和色差量化值。此外,由於人眼對低頻分量的影象比對高頻分量的影象更敏感,因此圖中的左上角的量化步距要比右下角的量化步距小。下面2個表中的數值對CCIR 601標準電檢視像已經是最佳的。如果不使用這兩種表,你也可以把自己的量化表替換它們。


亮度量化值表和色度量化值表


3、Z字形編排
量化後的係數要重新編排,目的是為了增加連續的“0”係數的個數,就是“0”的遊程長度,方法是按照Z字形的式樣編排,如下圖所示。這樣就把一個8×8的矩陣變成一個1×64的向量,頻率較低的係數放在向量的頂部。


量化DCT係數序號

0

1

5

6

14

15

27

25

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)進行編碼。
DeltaDC(0,0)k-DC(0,0)k-1

5
、 交流係數的編碼
量化AC係數的特點是1×64向量中包含有許多“0”係數,並且許多“0”是連續的,因此使用非常簡單和直觀的遊程長度編碼(RLE)對它們進行編碼。
JPEG使用了1個位元組的高4位來表示連續“0”的個數,而使用它的低4位來表示編碼下一個非“0”係數所需要的位數,跟在它後面的是量化AC係數的數值。

6、熵編碼
使用熵編碼還可以對DPCM編碼後的直流DC係數和RLE編碼後的交流AC係數作進一步的壓縮。
在JPEG有失真壓縮演算法中,使用霍夫曼編碼器來減少熵。使用霍夫曼編碼器的理由是可以使用很簡單的查表(Lookup Table)方法進行編碼。壓縮資料符號時,霍夫曼編碼器對出現頻度比較高的符號分配比較短的程式碼,而對出現頻度較低的符號分配比較長的程式碼。這種可變長度的霍夫曼碼錶可以事先進行定義。

7、組成位資料流
JPEG編碼的最後一個步驟是把各種標記程式碼和編碼後的影象資料組成一幀一幀的資料,這樣做的目的是為了便於傳輸、儲存和譯碼器進行譯碼,這樣的組織的資料通常稱為JPEG位資料流(JPEG bitstream)。

 

相關文章