原文網(wǎng)址:http://blog.csdn.net/newchenxf/article/details/51719597
2.1 以8x8的圖象塊為基本單位進行編碼
如下圖所示。比如一個160x160大小的原始圖像,就可以分成20x20個8x8圖像塊。
每個圖像塊共64個像素。像素可以用RGB或YUV表示,需要3個byte。所以嚴格來說,上圖3個箭頭代表的數(shù)據(jù),指的是RGB/YUV的某一個值,比如Y。
2.2 將RGB轉(zhuǎn)換為亮度-色調(diào)-飽和度系統(tǒng)(YUV),并重新采樣
YUV是什么?它也是一種很不錯的圖像數(shù)據(jù)表示方法,特別是在視頻領(lǐng)域。
Y:指顏色的明視度、亮度、灰度值;
U:指色調(diào);
V:指飽和度。
YUV是一個統(tǒng)稱,其實有很多具體格式,比如YUV420, YUV444, YUV422。
YUV的某些格式,和RGB比起來,其數(shù)據(jù)量要少很多。
比如YUV420,每個像素需要一個Y,每4個像素需要一個U/V,因此一個8*8圖像塊,數(shù)據(jù)量只要8x8x3/2 = 96byte。而RGB需要8x8x3 = 192byte。少了一半的數(shù)據(jù)量?,F(xiàn)在很多視頻都是YUV420作為色域。
當(dāng)然啦,在本次轉(zhuǎn)換,用的是YUV444, 也就是每個像素都有YUV的值。
YUV與RGB可以互相轉(zhuǎn)換。
Y=0.299R+0.587G+0.114B
U=0.148R-0.289G+0.473B
V=0.615R-0.515G-0.1B
2.3 FDCT與IDCT
一個是正變換,一個是逆變換。反正都可以稱為離散余弦變換。
根據(jù)8*8的二維DCT定義
其中:0<= u, v < 8
a(v) = a(u)
是輸入8x8像素的坐標(biāo)。
是輸出的8x8變換結(jié)果的坐標(biāo)。
不要把上式看的有多難,也不要被“離散余弦變換”這個詞給嚇到,其實他沒什么(如果你非要去追究,那就打開“信號與系統(tǒng)”的書復(fù)習(xí)一下吧,我攔不住你哈),上式其實就是一個運算公式而已。
輸入就是8x8的數(shù)據(jù)矩陣,經(jīng)過計算,輸出還是一個8x8的數(shù)據(jù)矩陣。
其實上式可以簡化為:
并且A和A轉(zhuǎn)置矩陣都是已知的。所以,說白了,就是個矩陣運算。對程序來說,很簡單。
稱G(0,0),也就是輸出8x8矩陣的(0,0)坐標(biāo)的值,為直流系數(shù),其他為交流系數(shù)。
之所以稱它為直流系數(shù),是因為當(dāng)u, v = 0時,cos()結(jié)果都為0,所以最后結(jié)果就是輸入矩陣的8x8的每個數(shù)值的和,再乘于a(u) x a(v) x 1/4 = 1/8。
當(dāng)然了,輸入數(shù)據(jù)其實是有3個的,也就是YUV,因此對每個8x8的原始圖像數(shù)據(jù),需要做3次DCT。
2.4 量化與反量化
定義:將DCT變換后的臨時結(jié)果,除以各自量化步長并四舍五入后取整,得到量化系數(shù)。
為什么可以量化?!
因為經(jīng)過DCT后,數(shù)據(jù)就不同了,左上方都是大數(shù)值,右下方都是小數(shù)值。比如左上方都是幾十幾百的,右下方附近,都是個位數(shù),那么,大數(shù)值和小數(shù)值就可以分別量化。
在術(shù)語里,左上方稱為低頻數(shù)據(jù),右下方稱為高頻數(shù)據(jù)。
你要是不理解,可以這么想,既然G(0,0)都是直流分量了,那頻率不就是0?不就是所謂的低頻?^^
還是不理解?好吧,那你也可以這么想:
比如cos(ax),a是常數(shù),x是變量。那么,根據(jù)頻率f = a/2π,a越大,函數(shù)的頻率越高。
看看DCT公式:
u,v 越大,則越在右下方對吧。當(dāng)計算某個G(u, v)時,x, y是變量,u, v相當(dāng)于常數(shù),當(dāng)u/v越大,則頻率越高!
這就是為啥右下方稱為高頻數(shù)據(jù)了!
好了,別走偏了,還繼續(xù)說量化。
JPEG系統(tǒng)分別規(guī)定了亮度分量和色度分量的量化表,色度分量相應(yīng)的量化步長比亮度分量大。
對量化系數(shù)的處理和組織
思想:JPEG采用定長和變長相結(jié)合的編碼方法。
直流系數(shù):通常相鄰8*8圖象塊的DC分量很接近,因此JPEG對量化后的直流分量采用無失真DPCM編碼。通常JPEG要保存所需比特數(shù)和實際差值。
交流系數(shù):經(jīng)過量化后,AC分量出現(xiàn)較多的0。JPEG采用對0系數(shù)的行程長度編碼。而對非0值,則要保存所需數(shù)和實際值。
ZIG-ZAG排序:為使連續(xù)的0個數(shù)增多,采用Z形編碼。
你要是不理解,看看下面的例子,就知道為啥ZIG-ZAG可以俘獲更多的0了!
3 應(yīng)用舉例
3.1 編碼
某個圖象的一個8*8方塊,的亮度值。
由于一個字節(jié)是0255,為了減小絕對值波動,先把數(shù)值移位一下,變成-128127。
接著,根據(jù)DCT變換公式,各種計算,獲得臨時結(jié)果。
根據(jù)亮度量化表量化后得到的量化系數(shù)矩陣
獲得量化結(jié)果:
可見,新的數(shù)據(jù),很小,很多是0。正如上文所說,這么多0,完全可以用游程編碼,大大縮小數(shù)據(jù)量。
3.2 解碼
先游程編碼恢復(fù)為
然后,根據(jù)量化表,恢復(fù)
再根據(jù)反離散余弦變換的公式:
結(jié)果為:
再右移127,恢復(fù)原始。
和原始圖像的數(shù)據(jù)相比,基本是一樣的,或者近似的!