天天看點

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

JPG格式的圖檔體積相對較小,是因為它采用了一系列的壓縮算法,壓縮圖檔弊端就是和原始的圖檔相比,它犧牲掉了一些畫面細節,這些丢失的細節或許可被人的肉眼看出,或許以人的肉眼難以發現,對于這種通過犧牲畫面的精細程度來達到縮小體積的目的的壓縮算法,我們稱之為“有損壓縮”或者“破壞性壓縮”。

JPEG和JPG的關系

你可能會有這樣的疑惑,JPEG和JPG看起來如此相像,它們到底是不是同一種圖檔格式?JPEG和JPG之間的關系到底是怎樣的?在回答這個問題之前,我們首先要了解,JPEG的來頭。

JPEG,全稱為“Joint Photographic Experts Group”,翻譯成中文,則是“聯合圖像專家小組”,這是一個成立于1986年的組織,1992年,該組織釋出了“JPEG标準”,這是一種針對圖像的壓縮而制定的标準。

使用JPEG标準壓縮的圖檔檔案,被稱為“JPEG檔案”,這種檔案的擴充名通常是JPG、JPEG、JPE、JFIF以及JIF,在這些檔案格式中,以JPG的使用最為廣泛。

如果這裡JPEG指的是聯合圖像專家小組,那JPEG與JPG則是制定壓縮标準的組織與采用該組織制定的壓縮标準壓縮成的圖檔的一種的格式的關系;

如果JPEG指的是JPEG壓縮标準,那JPEG與JPG則是一種圖像的壓縮标準與采用該标準壓縮成的圖檔的一種格式的關系;

如果JPEG指的是一張圖檔檔案的字尾名,那JPEG與JPG的關系則是采用JPEG标準壓縮的圖檔的兩種不同的格式。

色彩空間轉換

要壓縮圖檔,首先要知道這個圖檔中都包含了些什麼内容,在對圖檔的内容進行分解時,第一步就要進行色彩空間轉換。

所謂的色彩空間,指的是描述圖像的顔色的一組數值,比較常見的色彩空間有RGB、CMYK。

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

RGB,即是分别用三組數值,來表示紅、綠、藍,而紅、綠、藍三種顔色經過不同程度的配比,就會顯示出不同的顔色。通常RGB的色彩模型用于顯示屏的顯示。

CMYK,即是分别用四組數值,來表示青色、品紅、黃色和黑色,而青色、品紅、黃色和黑色四種顔色經過不同程度的配比,就會顯示出不同的顔色。通常CMYK的色彩模型用于印刷。

在JPEG壓縮圖像過程中,是怎麼用數值來表示圖像内容的呢?事實上,JPEG量化圖像的顔色時并非采用RGB模式,也非CMYK模式,而是YCbCr模式,其中,Y表示的是亮度,Cb表示的是彩度(藍),Cr表示的是彩度(紅)。那麼問題來了,為什麼JPEG在壓縮圖像時,不采用RGB和CMYK的色彩模型,而偏偏采用YCbCr這種看似奇葩的模式呢?這還要從人眼的工作機制談起。

我們的眼睛之是以能感覺圖像,是因為人眼内含有視錐細胞和視杆細胞,其中,視錐細胞具有感覺顔色的能力,而視杆細胞具有感覺亮度的能力,通常,我們的眼睛中,視杆細胞數量相對較多,是以人眼對亮度的敏感程度要高于對色彩的敏感程度。就像你熄燈時,你可以在暗光下漸漸地看清周圍的事物,而對周圍事物的顔色,你可能就不那麼敏感了。

JPEG正是利用了人眼的這一特性,在壓縮圖像時,将亮度和顔色分開處理。

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

 由于人眼對亮度很敏感,是以JPEG不會對亮度做太多改變,而人眼對顔色不甚敏感(科學研究表明,人眼大概可以區分出1000萬種不同的顔色,這種感覺能力相比于電腦,就沒那麼精确了),是以在人眼開始察覺色彩不對了之前,JPEG對顔色進行壓縮處理,這樣就算圖像損失了部分細節,人眼也不太容易捕捉得到。

JPEG在壓縮圖像時所進行的色彩空間轉換,指的就是将RGB轉換為YCbCr。

縮減取樣

在YCbCr模型中,Cb通道和Cr通道中所包含的資訊量遠遠少于Y通道中包含的資訊量,同時,人眼對色彩的敏感程度有限,是以,JPEG的壓縮算法主要對Cb和Cr通道中的資料進行縮減取樣,取樣的比例可以是4:4:4(無縮減取樣)、4:2:2(在水準方向2的倍數中取樣)和4:2:0(在水準方向和垂直方向的2的倍數中取樣),其中,以4:2:0最為常見。

離散餘弦變換(DCT)

通常我們認為,在8*8像素的一塊方格裡,它裡面的像素往往非常相似,是以,當進行到這一步時,JPEG會将圖像分為一個又一個的8*8的像素塊。
JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

▲一個8*8的像素塊,圖檔來自維基百科

每一個像素塊都利用離散餘弦變換來編碼,法國數學家傅裡葉告訴我們,幾乎所有的周期函數,都可以用一系列的“弦波”來表示,也就是說,靠着帶權重的一系列不同餘弦值的相加,就可以重構出我們的原圖。最後,每個8*8的像素塊都會通過特定的函數,來生成一個新的8*8的數字矩陣。

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質
▲一個8*8的數字矩陣,圖檔來自維基百科

量化

事情到這裡還沒算完,通過離散餘弦變換所得到的數字可不能被直接壓縮,他們還需要再處理一下,這就是量化。

量化的過程,實際上就是對DTC系數的一個優化過程,在一個8*8像素的區域中,每個像素點間的差異都很大時,它的弦波頻率就很高,我們稱之為高頻區,相反地,一個8*8像素的區域中,每個像素點間的差異很小,那它的弦波頻率就很低,我們稱之為低頻區,剛剛的DCT算法已經把哪裡頻率高、哪裡頻率低給整理出來了。

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

▲越接近左上,頻率越低,越接近右下,頻率越高。

人眼對高頻區(小範圍、高複雜度)的辨識能力較差,而對低頻區(大範圍、低複雜度)的辨識能力較好,是以JPEG就根據人眼的這一特征将高頻區進行大幅的簡化和壓縮,量化的過程,實際上就是把頻率領域上的每個成分,除以一個特定的常數,然後将計算結果四舍五入,取一個整數,JPEG會将高頻區的成分通過算法,使其接近于0,然後四舍五入,取該成分的值為0,最後,我們大概會得到這樣一個矩陣:

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

▲圖檔來源:維基百科

可以看到,這個矩陣中有很多連續的0,這就對壓縮非常有利了。

熵編碼

終于到了最後一步了,那就是壓縮,仔細觀察剛剛得到的最終的矩陣,可以看到,從左上角到右下角,連續的0的數量急劇上升,這種情況就要用熵編碼技術,對資料進行編碼。

JPEG從左上角開始,以Z字形來回穿梭,直至經曆了矩陣中的所有數字,到達右下角。

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質

▲Z字形穿梭掃描的路徑,圖檔來自維基百科

此時的編碼就變成了這樣:

JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質
當剩下的數字都是0,且過早結束的編碼,可以将連續的0的部分采用霍夫曼編碼表示為“EOB”,最後,這串編碼就成了這個樣子:
JPEG 圖像壓縮原理JPEG和JPG的關系色彩空間轉換縮減取樣離散餘弦變換(DCT)量化熵編碼圖檔品質
現在,我們就得到了JPEG的編碼了。通過一系列的處理,可以看到,圖像中的資訊達到了壓縮和簡化的目的。這就是一幅原始圖像被壓縮為JPEG的大概過程。

圖檔品質

在生成一張JPG圖像檔案時,你通常需要設定圖像品質參數,這個參數的數值越大,圖像的品質也就越高,同時圖檔檔案的體積也就越大,相反地,數值越小,圖像的品質就越低,同時圖檔檔案的體積越小

 參考連結:

       http://www.360doc.com/content/17/0901/18/41193811_683881904.shtml