JPEG(Joint Photographic Experts Group)此團隊於 1986 年成立,其目的為制定靜態 影像之數位壓縮與編碼標準。Joint Photographic Experts Group 於 1994 年制定 JPEG 標 準,其正式名稱為 ISO/IEC 10918-1 | ITU-T Rec. T.81 “Information Technology-Digital compression and coding of continuous-tone still images“。基本上 JPEG 標準有四種不同 的 工 作 模 式 : Baseline process 、 Extenden DCT-based process 、 Lossless process 、 Hierarchical process,一般俗稱的 JPEG 壓縮格式指的即是 Baseline process。本研究中 所實現的 JPEG 硬體編碼器即是以 Baseline process 為設計基礎。
圖 2.1 JPEG 四種工作模式
4
現今許多 Baseline process 的 JPEG 硬體編碼器設計,其架構流程如下圖所示。而 Run Length Encoding、Variable Length Encoding、及 Huffman Encoding 這三個部份,我 們又稱之為 Entropy Encoding。
圖 2.2 JPEG Encoder 架構流程圖
2.1.1. RGB to YCbCr
RGB 是我們常用的色彩座標表示方式,是由色光三原色 Red、Green、Blue 以不 同的比例相加,產生多種多樣的色光。
YCbCr 是色彩空間的一種,通常會用來作為數位攝影系統使用。Y 代表著顏色成 份的亮度(Luminance),Cb 與 Cr 代表著顏色成份的彩度(Chrominance)。
由於常見的影像資料是採用 RGB 的色彩座標,而在影像處理中使用的色彩座標 多為 YCbCr 色彩座標。因此需要作色彩座標的轉換,其轉換公式如下:
0.299 0.587 0.114 b 0.168R 0.331G 0.499B 128
0.5 0.419 0.081 128
作色彩座標轉換的目的,在於自然界影像中,人類視覺對於亮度的敏銳度比彩度 來的高。以圖 2.3 為例,左邊為有名的 Lunna 影像,中間為 RGB 色彩空間,右邊為 YCbCr 色彩空間。在 YCbCr 色彩空間中,其 Y 分量在細解部份的資訊明顯比 Cb 及 Cr 分量來的多。
5
圖 2.3 RGB and YCbCr 色彩空間示意圖
2.1.2. Sampling
圖 2.4 Sampling 示意圖
Sampling 是針對 YCbCr 色彩空間的分量,以不同比例做取樣。一般常見的 Sampling 方式主要有四種:4:4:4、4:2:2、4:2:0、Gray。以上圖所示。
4:2:0 為 JPEG 常見的取樣方式,是以每個2 2的 Block 為單位,取得 4 個 Y component 與一個 Cb、Cr 的 component,縮減彩度分量取樣。4:2:2 為電視訊號常用 的取樣方式,是以水平的 2 個 Block 為單位,縮減其一半彩度取樣,取得 2 個 Y component 以及 1 個 Cb 與 Cr component。4:4:4 是在每塊 Block 為單位,採取所有 component。Gray 則是每塊 Block 為單位,只採取 Y component。
在圖 2.4 中,每個深色方塊,我們稱為一個 MCU(Minimum Coded Unit)。由於每 個 component 編碼分別採用8 8Block,根據取樣的方式,來決定 MCU 由多少個
6
8 8Block 組成。因此在取樣時,影像資料是以 1 個 MCU 為單位,由左到右、由上 到下讀取,如圖 2.5 所示。
圖 2.5 Minimun Coded Unit
YCbCr 中每個 component 在 MCU 下排列方式,會根據取樣的方式有所不同。以 4:4:4 為例,每個 MCU 由 1 個8 8Block 所組成,而在 MCU 內的 component 的排列 方式為 Y-Cb-Cr;4:2:2 則由 2 個8 8Block 組成一個 MCU,其 component 排列方式為 Y-Y-Cb-Cr;4:2:0 是以 4 個8 8組成一個 MCU,其排列方式為 Y-Y-Y-Y-Cb-Cr;Gray 則是每個8 8Block 為一個 MCU,其 component 排列方式為 Y。圖 2.6 為 4:2:0 取樣 的 component 在 MCU 中的排列方式。
圖 2.6 MCU 內 component 排列示意圖
2.1.3. Discrete Cosine Transform(DCT)
Discrete Cosine Transform(DCT)是由 Ahmed[3]等人於 1974 年提出,至今已經被廣
7
8
Chen DCT 是由 Chen[4]等人針對 DCT 運算上所改善之架構。以圖 2.8 所示,在 原先 DCT 運算中,運算完 1 個8 8Block 的 DCT 轉換,需要 4096 個乘法器及 4032 個加法器。而在 Chen DCT 中,運算完一維 8 points 只需要 18 個乘法器及 26 個加法 器,換算下來運算完8 8Block 需要 288 個乘法器及 416 個加法器,明顯比原先的 DCT 架構使用較少的乘法器與加法器,且運算成本上也能有所改進,且 Chen DCT 具有規 則以及架構簡單的特性。
圖 2.8 Chen DCT 架構圖
2.1.4. Zigzag-Mapping
由於影像資料為二維矩陣,在經過 DCT 轉換後,訊號從左上角至右下角呈現的 頻率愈來愈高。如圖 2.9, Zigzag-Mapping 的方式就是讓 DCT 完的影像資料能從 低頻至高頻的方式排列。
9
圖 2.9 Zigzag‐Mapping
由於大多數的高頻訊號在後續的 Quantization 處理後,其值多數會為零,因此透 過 Zigzag-Mapping,能將零值集中,以方便之後的 Entropy Encoding 上能有較好的 效果。
2.1.5. Quantization
在 JPEG Encoder 中,進行 Quantization 的目的,是因為 DCT 轉換後的資料分為低 頻訊號與高頻訊號,而大多數的影像資訊透過低頻訊號足以呈現,因此要將 DCT 轉換 後的資料再作處理,使的高頻訊號係數變小,以利於後面的 Entropy Encoding 能得到 較好的壓縮效果。
因此,在 JPEG Encoder 中每一個8 8 DCT Block(如圖 2.10)的每一個係數與 Quantization Table (如圖 2.11)上的對應的係數相除後,其得到之商取整數,其值即為 我們所要的結果(如圖 2.12),此相除的過程即為 Quantization。
JPEG Encoder 針對亮度與彩度的部份,建立了兩個不同的 Quantization Table,因 為亮度與彩度對於人眼上敏銳度上不同,因此在處理細膩度也有所不同。
10
圖 2.10 Orignal DCT Coefficients
圖 2.11 Quantization Table
圖 2.12 Quantized DCT Coefficients
11
2.1.6. Entropy Encoding
在 Entropy Encoding 中,分成三個階段:Run Length Encoding、Variable Length Encoding、及 Huffman Encoding。經過 DCT 及 Quantization 後,每一塊8 8Block 內 可分成 DC 值與 AC 值兩類,所謂的 DC 值即為8 8Block 中最左上角的值,而其餘 的 63 個值即為 AC 值。由於每個8 8Block 的 DC 值互有關聯性,所以 DC 值差異性 較小。因此將當前 DC 值與前一個8 8Block 的 DC 值相減,並儲存其差值,此動作 能減少其值的大小與字元長度,達到資料壓縮的目的。
而 Run Length Encoding 的主要目的是在 Zigzag-Mapping 作完後的一維陣列中,
將其非零係數之間出現的零值係數個數計算出來,並將其分別記錄下來,因此 Run Length Encoding 完後資料格式為([零值個數]非零系數值)。以圖 2.13 為例,非零係數 之 AC 值為-2,與前一個非零係數之間無零值存在,因此在編碼上將編成[0]-2,依此 類推,接下來依序編成「[0]3,[0]1,[0]1,[0]1」,而下一個非零係數 1 與前一個非零 係數 1 之間包含了 3 個零值係數,因此其編碼將為[3]1,而在 Run Length Encoding 中,
會將最後一個非零系數後面的長串零值編為[eob],因此圖 2.13 中將最後一個非零係 數之後到第 64 個係數編為[eob]。而 Run Length Encoding 中,記錄零值個數的單位長 度為 4bits,故最大只能記錄到 15 個零值,因為當連續零值超過 16 個以上時,將其 16 個零值編為[zrl],例如當欲編碼為:「7,4,<30 zeros>,1,<rest of zero>」,則經過編 碼後,其編碼為:「[ ]7,[0]4,[zrl],[14]1,[eob]」。
圖 2.13 Run Length Encoding
之後的 Variable Length Encoding 再將 Run Length Encoding 後的編碼結果,將 其非零值轉為二進制,並記錄其二進制字碼長度,如非零值為負數,則將其值作 1 的
12
補數。其原因在於當正數轉換為二進制後,其最高位元為 1;而負數經過轉換為 1 的
補數後,則最高位元為零,其編碼後格式為「[零值個數 長度]非零值二進制」。
以圖 2.14 為例,DC 值 7,經過轉換成二進制後,其值為 111,長度為 3,因此 DC 值 7 將編成「[3]111」,而非零 AC 值-2,經轉成二進制並作 1 補數轉換後,其二進 制為 01,長度為 2,因此編為「[0 2] 01」,以此類推。
圖 2.14 Variable Length Encoding
圖 2.15 DC & AC Huffman Table
13
接下來的 Huffman Encoding 是將 Variable Length Encoding 後的編碼,透過查 詢 Huffman Table 後,得到對應之編碼。JPEG Encoder 針對 DC 值與 AC 值分別有其相 對應的 Huffman Table,此外 JPEG Encoder 在色彩空間上,針對亮度與彩度,分別建 立其相對應的 Huffman Table。
以圖 2.15 為例,其 DC 值 7 經過 Run Length Encoding 及 Variable Encoding 後,
其編碼為[3] 111,透過 Huffman Encoding 查到[3]其對應的 DC Huffman Table 得到 其對應編碼為 110,因此 DC 值 7 經過 Entropy Encoding 後,將編碼成 110111;而非 零值-2,經過 Run Length Encoding 及 Variable Length Encoding 後,其編碼為[0 2]
01,透過 Huffman Encoding 查到[0 2]其對應的 AC Huffman Table 得到其對編碼為 100,因此 AC 值-2 經過 Entropy Encoding 後,將編碼成 10001,以此類推。因此原先 編碼為「7,-2,3,1,1,1,0,0,0,1,0,0,0,0,…」經過 Entropy Encoding 後,將如圖 2.15 所示,編碼成「11011110001100110110110111111110100」。