JPEG圖像壓縮原理簡介

東方之既白 發佈 2020-01-25T07:44:34+00:00

這個名稱代表Joint Photographic Experts Group。1. 概述JPEG編碼的主要流程是:色彩空間轉換 、下採樣、 分塊 、離散餘弦變換、量化、熵編碼技術。

JPEG(發音:[ˈdʒeɪpɛg])是一種針對照片視頻而廣泛使用的有損壓縮標準方法。

這個名稱代表 Joint Photographic Experts Group(聯合圖像專家小組)。聯合圖像專家小組1992年發布了JPEG的標準而在1994年獲得了ISO 10918-1的認定。JPEG與視頻音頻壓縮標準的MPEG(Moving Picture Experts Group)很容易混淆,但兩者是不同的組織及標準。

其實JPEG不是一種文件格式,它是由聯合圖像專家小組推出的一種圖像壓縮方法(類似於視頻中的H.264等編解碼標準)。而JPG或者JFIF格式僅僅是一種數據的包裝容器(類似於視頻中MP4、MOV等封裝格式)。

1. 概述

JPEG編碼的主要流程是:色彩空間轉換 (Color Conversion)、下採樣(Downsampling)、 分塊 (Dividing Patch) 、離散餘弦變換(Discrete cosine transform)、量化(Quantization)、熵編碼技術(Entropy coding)。

2. 色彩空間轉換(Color Conversion)

我們使用傳感器採集到的原始(RAW)圖像使用的是RGB色彩空間來表示的。也就是說,按照每一個像素的RGB(Red, Green, Blue)值填充到對應的像素位置。

首先,我們將RGB(紅綠藍)轉換為一種稱為YCrCb (YUV)的不同色彩空間。

•Y成分表示一個像素的亮度 (luminance) •U成分表示色度(飽和度)(Chrominance)•V成分表示色度(飽和度)

RGB空間到YUV空間轉換公式為:

下圖為分解開的Y、U、V的示例:

3. 採樣(Downsampling)

下採樣、也就是減少人類視覺系統不敏感的色度(U和V的成分)。雖然減少了顏色數量,但是人眼並不會察覺到圖像質量有任何的差異。

JPEG上這種縮減取樣的比例可以是4:4:4(無縮減取樣),4:2:2(在水平方向2的倍數中取一個,顏色為之前的 1/2),以及最普遍的4:2:0(在水平和垂直方向 2 的倍數中取一個,顏色為之前的 1/4)。

如圖:


4. 分塊 (Dividing Patch)

源圖像中每點的 3 個分量是交替出現的,先要把這 3 個分量分開,存放到 3 張表中去。然後由左及右,由上到下依次讀取 8*8 的子塊,存放在長度為 64 的表中,即可以進行DCT變換。如果原始圖片的長寬不是 8 的倍數, 都需要先補成 8 的倍數, 使其可以進行一塊塊的處理。編碼時,程序從源數據中讀取一個 8*8的數據塊後,進行 DCT 變換,量化,編碼,然後再讀取、處理下一個 8\times8 的數據塊。圖像的數據值必須減去128,是因為 DCT 公式所接受的數字範圍是 -128 到 127 之間。

5、離散餘弦變換(Discrete Cosine Transform)

離散餘弦變換是一種類似於傅立葉變換的數學工具(不清楚傅立葉變換的同學可以移步:https://www.bilibili.com/video/av19141078來簡單了解傅立葉變換).它將信號從時間域轉換到頻率域

這一步,將視頻中的每個成分(Y, U, V)生成三個區域,每一個區域再劃分成如瓷磚般排列的一個個的 8*8 子區域,每一子區域使用二維的離散餘弦變換(DCT)轉換到頻率空間。

如果有一個如這樣的的 8*8 的8-比特(0~255)子區域:

如圖:

用矩陣表示為:



原始數據每個值的範圍是 [0-255] ,使每個數字減去 128 ,標準化。

且接著使用離散餘弦變換,和舍位取最接近的整數,得到結果為


左上角相當大的數值稱為DC係數(直流係數);其他 63 個值稱為AC係數(交流係數)。

6.量化

利用人眼對低頻數據敏感對高頻數據不敏感的特性,我們可以將離散餘弦變換後的很多更高頻率的成分舍位成為接近 0 ,且剩下很多會變成小的正或負數。

JPEG標準中定義了量化表。

使用QYQY量化矩陣與前面所得到的DCT係數矩陣逐項相除,得到結果為:

7. 熵編碼技術(Entropy Coding)

熵編碼是一種無損壓縮的技術,它使用Z字形(zigzag)將矩陣數據排列。然後將排列後的數據使用哈夫曼編碼(哈夫曼編碼的資料請自行查找))。

對於前者量化的係數所作的Z字體序列會是:

−3, 0,−3, −2, −6,2, −4, 1, −3,1, 1, 5, 1, 2,−1, 1, −1, 2, 0, 0,0, 0, 0, −1, −1, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0,0

當剩下的所有係數都是零,對於過早結束的序列,JPEG有一個特別的霍夫曼編碼用詞。使用這個特殊的編碼用詞,EOB,該序列變為

−3, 0,−3, −2, −6,2, −4, 1 −3,1, 1, 5, 1, 2,−1, 1, −1, 2, 0, 0,0, 0, 0, −1, −1, EOB

在這一步數據量得到了極大的壓縮。

8. 結果

JPEG是一種有損壓縮算法。所以不同程度的壓縮比例,會呈現出不同的文件大小,以及差異化的可視化呈現。以下,呈現了相關的壓縮比例與原始圖像的對比。從上到下,呈現了壓縮比從小到大的結果。每一個圖片中,左邊是原始圖像,右邊是壓縮後的圖像。對應的文件大小顯示在圖線的上方。

9. 引用

https://ustc-dip.github.io/slice/Chapter8-圖像壓縮.pdf

https://en.wikipedia.org/wiki/JPEG

https://blog.csdn.net/songdan0201/article/details/51957758

https://taozhaojun.github.io/2016/01/17/camera/

https://compressjpeg.com

https://www.jianshu.com/p/71caefdb1e14



關鍵字: