JPEG編碼

一、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)進行編碼。
Delta=DC(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)。


原作http://nicedream.blog.hexun.com/6425370_d.html

發佈了20 篇原創文章 · 獲贊 6 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章