1.顏色模式轉(zhuǎn)換
Y?=?0.299R+0.587G+0.114B
Cb?=?-0.1687R-0.3313G+0.5B+128
Cr?=?0.5R=0.418G-0.0813B+128
一般來(lái)說(shuō)辛萍,C?值?(包括?Cb?Cr)?應(yīng)該是一個(gè)有符號(hào)的數(shù)字,?但這里通過(guò)加上128,使其變?yōu)?位的無(wú)符號(hào)整數(shù)导而,從而方便數(shù)據(jù)的存儲(chǔ)和計(jì)算源内。
R?=?Y+1.402(Cr-128)
G?=?Y-0.34414(Cb-128)-0.71414(Cr-128)
B?=?Y+1.772(Cb-128)
“色差”這個(gè)概念起源于電視行業(yè)捌治,最早的電視都是黑白的,那時(shí)候傳輸電視信號(hào)只需要傳輸亮度信號(hào),也就是Y信號(hào)即可束世,彩色電視出現(xiàn)之后憨栽,人們?cè)赮信號(hào)之外增加了兩條色差信號(hào)以傳輸顏色信息帜矾,這么做的目的是為了兼容黑白電視機(jī),因?yàn)楹诎纂娨曋恍枰幚硇盘?hào)中的Y信號(hào)即可屑柔。
對(duì)于人眼來(lái)說(shuō)屡萤,圖像中明暗的變化更容易被感知到,這是由于人眼的構(gòu)造引起的掸宛。視網(wǎng)膜上有兩種感光細(xì)胞死陆,能夠感知亮度變化的視桿細(xì)胞,以及能夠感知顏色的視錐細(xì)胞唧瘾,由于視桿細(xì)胞在數(shù)量上遠(yuǎn)大于視錐細(xì)胞措译,所以我們更容易感知到明暗細(xì)節(jié)。
2.采樣(YCrCb YUV411 YUV422)
3.分塊(8 * 8)
JPEG?編碼是以每8x8個(gè)點(diǎn)為一個(gè)單位進(jìn)行處理的.?所以如果原始圖片的長(zhǎng)寬不是?8?的倍數(shù),?都需要先補(bǔ)成8的倍數(shù),?使其可以進(jìn)行一塊塊的處理饰序。將原始圖像數(shù)據(jù)分為8*8的數(shù)據(jù)單元矩陣之后领虹,還必須將每個(gè)數(shù)值減去128,然后一一帶入DCT變換公式求豫,即可達(dá)到DCT變換的目的塌衰。圖像的數(shù)據(jù)值必須減去128,是因?yàn)镈CT公式所接受的數(shù)字范圍是-128到127之間蝠嘉。
4.離散余弦變換(DCT)
F(n)?=?C(n)*E(n),這里最疆,E(n)是一個(gè)基底,C(n)是DCT系數(shù)蚤告,F(xiàn)(n)則是圖像信號(hào)肚菠;如果考慮垂直方向的變化,那就需要一個(gè)二維的基底罩缴。
5.量化
前面的變換都是可逆的蚊逢,也就是數(shù)據(jù)的信息并沒(méi)有丟失。
數(shù)據(jù)的大部分壓縮都是在量化這里箫章,有時(shí)候保存圖片的時(shí)候軟件會(huì)提示你選擇保存的精度烙荷,其實(shí)就是改變量化的程度,或者改變量化系數(shù)矩陣乘的倍數(shù)檬寂。
由于對(duì)亮度和色度的精度要求不同终抽,分別對(duì)亮度和色度采用不同的量化表。前者細(xì)量化,后者粗量化
6.ZigZag掃描排序
矩陣的量化還有最后一步要做昼伴,就是把量化后的二維矩陣轉(zhuǎn)變成一個(gè)一維數(shù)組匾旭,以方便后面的霍夫曼壓縮,但在做這個(gè)順序轉(zhuǎn)換時(shí)圃郊,需要按照一個(gè)特定的取值順序价涝。?這么做的目的只有一個(gè),就是盡可能把0放在一起持舆,由于0大部分集中在右下角色瘩,所以才去這種由左上角到右下角的順序,經(jīng)過(guò)這種順序變換逸寓,最終矩陣變成一個(gè)整數(shù)數(shù)組
7.DC系數(shù)的差分脈沖調(diào)制編碼
8*8的圖像塊經(jīng)過(guò)DCT變換之后得到的DC系數(shù)有兩個(gè)特點(diǎn):
(1)系數(shù)的數(shù)值比較大居兆;
(2)相鄰的8*8圖像塊的DC系數(shù)值變化不大;
根據(jù)這兩個(gè)特點(diǎn)竹伸,DC系數(shù)一般采用差分脈沖調(diào)制編碼DPCM(Difference?Pulse?Code?Modulation)泥栖,即:取同一個(gè)圖像分量中每個(gè)DC值與前一個(gè)DC值的差值來(lái)進(jìn)行編碼。對(duì)差值進(jìn)行編碼所需要的位數(shù)會(huì)比對(duì)原值進(jìn)行編碼所需要的位數(shù)少了很多勋篓。假設(shè)某一個(gè)8*8圖像塊的DC系數(shù)值為15吧享,而上一個(gè)8*8圖像塊的DC系數(shù)為12,則兩者之間的差值為3生巡。
8.DC系數(shù)的中間格式計(jì)算
JPEG中為了更進(jìn)一步節(jié)約空間,并不直接保存數(shù)據(jù)的具體數(shù)值见妒,而是將數(shù)據(jù)按照位數(shù)分為16組孤荣,保存在表里面
9.AC系數(shù)的行程長(zhǎng)度編碼(Run Length Encoding)
量化之后的AC系數(shù)的特點(diǎn)是,63個(gè)系數(shù)中含有很多值為0的系數(shù)须揣。因此盐股,可以采用行程編碼RLE(Run?Length?Encoding)來(lái)更進(jìn)一步降低數(shù)據(jù)的傳輸量。利用該編碼方式耻卡,可以將一個(gè)字符串中重復(fù)出現(xiàn)的連續(xù)字符用兩個(gè)字節(jié)來(lái)代替疯汁,其中,第一個(gè)字節(jié)代表重復(fù)的次數(shù)卵酪,第二個(gè)字節(jié)代表被重復(fù)的字符串幌蚊。例如,(4,6)就代表字符串“6666”溃卡。但是溢豆,在JPEG編碼中,RLC的含義就同其原有的意義略有不同瘸羡。在JPEG編碼中漩仙,假設(shè)RLC編碼之后得到了一個(gè)(M,N)的數(shù)據(jù)對(duì),其中M是兩個(gè)非零AC系數(shù)之間連續(xù)的0的個(gè)數(shù)(即,行程長(zhǎng)度)队他,N是下一個(gè)非零的AC系數(shù)的值卷仑。采用這樣的方式進(jìn)行表示,是因?yàn)锳C系數(shù)當(dāng)中有大量的0麸折,而采用Zigzag掃描也會(huì)使得AC系數(shù)中有很多連續(xù)的0的存在锡凝,如此一來(lái),便非常適合于用RLC進(jìn)行編碼磕谅。
10.AC系數(shù)的中間格式計(jì)算
11.熵編碼(哈夫曼編碼或者算術(shù)編碼)
哈弗曼幾乎是所有壓縮算法的基礎(chǔ)私爷,它的基本原理是根據(jù)元素的使用頻率,調(diào)整元素的編碼長(zhǎng)度膊夹,以獲得更高的壓縮比衬浑。
Huffman編碼時(shí)DC系數(shù)與AC系數(shù)分別采用不同的Huffman編碼表,對(duì)于亮度和色度也采用不同的Huffman編碼表放刨。因此工秩,需要4張Huffman編碼表才能完成熵編碼的工作。具體的Huffman編碼采用查表的方式來(lái)高效地完成进统。然而助币,在JPEG標(biāo)準(zhǔn)中沒(méi)有定義缺省的Huffman表,用戶可以根據(jù)實(shí)際應(yīng)用自由選擇螟碎,也可以使用JPEG標(biāo)準(zhǔn)推薦的Huffman表眉菱。或者預(yù)先定義一個(gè)通用的Huffman表掉分,也可以針對(duì)一副特定的圖像俭缓,在壓縮編碼前通過(guò)搜集其統(tǒng)計(jì)特征來(lái)計(jì)算Huffman表的值。