jpeg編解碼概述
本博文為概覽性介紹。後面有空了再分幾篇博文分別介紹所用到的技術細節。
1.編解碼目標
編碼和解碼是個逆過程。jpeg編碼的目的在於圖形去冗餘,進行數據壓縮,解碼的目的在於還原影像,使能夠進行預覽。
2.編碼過程
貼一張網上的圖片,但缺少了一些步驟,下面用文字來描述每一個步驟。
2.1.取樣。
8位取樣,像素值的範圍鎖定在0-255,無符號,都為正數。
2.2.分塊(block)
補成8×8的block,以應對寬和高不是8的整數倍的情況,方便後續進行8×8的DCT2變換。
2.3.零偏置(LevelOffset)
通過減28-1=128,使各個像素值以0為中心分布,變換後的值有的為正,有的為負,在[-128,127]區間分布。
2.4.8×8的二維離散餘弦變換(DCT2)。
DCT變換是最小均方誤差條件下的得出的最佳正交變換。可以去相關性,將時域數據變換到頻域,將能量集中於低頻分量附近。
變換後可以看到:變換前的8×8個數據值,大小都很接近;變換後,能量集中於左上角,右下角的較小。左上角——直流分量值的絕對值一般變成了最大的值。
2.5.z字形編碼(zigzag scan)。
由2維變1維,一般後掃描到的值的絕對值小於先掃描的。
2.6.量化(quantization)。
將較大的值按一定的倍數進行縮小,而這個縮小倍數視位置不同而不同。(補充:該步驟可以與上一步顛倒)(如果先量化再掃描,可以看到:在量化後,後下角的值大部分都變成接近0的較小的值)
2.7.差分脈衝編碼(DPCM)對直流係數(DC)進行編碼。
相同component分量的每個block的直流分量值,設置為一個差值,為:cur_block_dc_val – last_block_dc_val,DPCM也由此而來,即DC值的差分。
2.8.行程編碼(RLE)對交流係數(AC)進行編碼。
8×8的數據塊,除了第一個DC值外,其他63個都是交流值,需要用到RLE編碼。
RLE也稱為遊程編碼,由一對值來表示,例如(m,n),m表示距離下一個非零值的距離,n表示下個值的值大小。例如(0,12)表示緊接著的值是12,而(4,6)表示中間經過4個0後,下個值為6。
2.9.熵編碼(entropy encode)。
一般使用範式霍夫曼編碼(huffman_encode——可變長編碼演算法中的一種),高概率的字元分配較短的code來表示,低概率的字元分配較長的code來表示。
3.其他補充說明
取樣和量化都是有損編碼,而DCT變換、DPCM、RLE、HuffmanEncode為無損編碼。