你大爺永遠是你大爺!JPEG 憑什麼經久不衰?| 圖文

1992 年的那個夏天,一位跟您一樣的紳士在黑暗的房間裡死死盯着電腦。一旁的調制解調器瘋狂閃爍,竭盡全力讓這張 720×575 像素的圖片,一行一行慢加載。而這在近乎無盡的等待中,紳士幾乎要瘋狂了。

直到JPEG的出現解了燃眉之急!

1992 年,“聯合圖像專家組”創建了第一個國際圖像壓縮標準,它能在不明顯降低圖像質量的基礎上,把圖像壓縮至原始大小的10%。

隨着數碼相機、掃描儀、互聯網的發展,JPEG迅速成爲應用最廣泛的圖像格式。直到32年後的今天,你大爺還是你大爺,沒有任何其他圖像格式能跟JPEG抗衡。

JPEG 憑什麼稱霸圖像界30 多年?它究竟有多巧妙?

視頻版

↓↓ 看完這個視頻就知道了 ↓↓

↑↑ 信我,真的超級好看 ↑↑

圖文版

在互聯網的古早時代,JPEG 是憑藉強勁的壓縮實力展露頭角的。所以故事的開始,我們要從JPEG的壓縮原理談起。

而它的原理,可以說是妙蛙種子吃着妙脆角進了米奇妙妙屋,那叫一個妙。

在 1992 年以前,主要的圖像格式都是無損格式。要把它們壓小,首先要知道圖像中的哪些信息可以偷偷捨棄掉。這就涉及到了兩個心理視覺原理。

先講第一個:你可以看看這三張圖片,哪兩張看起來區別更大?顯然是這兩張。這是因爲人眼對亮度的變化,要比對色彩的變化敏感得多。

原因也很簡單:人眼中有視錐、視杆細胞兩種細胞,分別負責感受顏色和亮度。

負責感受顏色的視錐細胞大概有600~700萬個,而負責感受亮度的視杆細胞則有1億2500萬個,所以人眼對亮度的變化非常敏感,但對色彩的變化就遲鈍一些。

既然這樣,那就壓縮一些顏色信息唄~這就是JPEG壓縮的第一步。

怎麼壓縮顏色呢?很簡單,圖片由一個個像素組成,每個像素包含紅綠藍三種元素,利用這個公式,我們可以把RGB模型轉換成YCbCr 模型,其中Y表示亮度,Cb和Cr分別表示藍色和紅色的色度。

轉換完後,就可以把藍色、紅色色度這兩張圖,每四小塊合併成一大塊,這樣就把顏色信息壓成了原來的1/4——反正人眼對顏色不敏感,所以也不會有太大影響。這就是 JPEG 對第一個視覺原理的應用。

而第二個視覺原理是:人眼擅長感受低頻信號,卻不擅長感受高頻信號。

這是什麼意思呢?低頻信號,是這種指像素之間變化比較平緩的線條。比如整片的天空和岩石表面。而高頻信號,是指這種像素之間變化比較劇烈的線條,比如複雜紋理。

比如你可能根本沒發現,這張圖片的左下角還藏着一隻花豹。這就是因爲你的眼睛對高頻信號不敏感。

所以只要把圖片中的高頻信號刪掉一些,就可以把圖片再壓小一點。

但問題是,怎麼區分高頻和低頻信號呢?這裡,就涉及到JPEG算法的精髓了。

讓我們請出小李子當一下模特:如果我們只看其中一行像素的亮度值,那它的頻率變化曲線是這樣的,非常複雜。

但所有複雜的事物,都可以還原爲簡單事物的集合。比如不管多複雜的圖案,都可以用最基礎的積木搭建出來。任何一條曲線,都可以還原爲若干餘弦波的疊加。這行像素的頻率變化曲線也一樣。利用這8條基礎頻率曲線,就可以把它給拼湊出來。

一行像素是一維的,但圖片是二維的。那再把8條頻率曲線豎着排一列,重疊的位置兩兩疊加,我們就得到了一張由64個基函數構成的“基圖”。

關鍵就在這裡,這“基圖”中的這64個基函數,每個都相當於一塊積木。任何一張圖片的顏色和亮度圖層,都可以用這些積木搭建出來。

比如我們可以把亮度圖層中每8*8個像素劃分成一個區塊,然後用基函數去“量”這個區塊,得到一個矩陣。矩陣中的每一個數字,就代表這張圖需要用到多少塊不同的積木。

這裡的275.5,就代表它需要用275.5個第一種積木,59.5個第二種積木......

更妙的是,觀察整個矩陣,你會發現左上角的數字遠大於右下角,因爲左上角的“積木”代表的是低頻信號。而絕大多數圖片中的主要信息,都是低頻信號。而高頻信號,比如你臉上的鼻孔、痘痘、皺紋,跟那張大臉比起來,只是一小部分而已。

爲了進一步區分低頻和高頻信號,專家組還提供了一組量化矩陣。只要用處理好的亮度和色度圖層分別除以量化矩陣,就能得到一大堆0,只剩下9個非0的數字。

這意味着,其實只要用9種基礎“積木”,就能把小李子搭的人模人樣了。這能讓我們大大減少圖片的信息量。

而且量化矩陣裡面的數字還可以根據需求變化。如果你想把圖片壓小,那最終得到的0越多,要用到的積木越少,但出現這種鋸齒狀的“僞影”的概率也就越大。

至於這些0,就是人眼比較麻木的高頻信息,把它們編碼打包,減少冗餘,JPEG的壓縮就大功告成了。

可以看出,JPEG的巧妙,在於它充分利用了人類視覺的特點,巧妙地用算法捨棄了你注意不到的信息,實現了出色的壓縮效果。

但JPEG之所以始終是圖像界的大爺,靠的不光是技術,還有當時拉胯的算力。比如在JPEG誕生的時候,就有比它更會壓縮的算法,叫“卡洛南-洛伊變換”。但它所需要的計算量太大,遠超出那個年代的計算機可實現的水平。所以排名第二的DCT算法才成爲了最終的贏家。

而且畢竟是最早一代的圖像壓縮標準, 隨着後續的改進,JPEG的孫子輩們在實力上也已經超越了它。比如在2000年,聯合圖像專家組又發佈了另一種新的壓縮圖像標準:JPEG2000。它能在保持相同圖像質量的情況下,把壓縮率提高200%,甚至還支持無損壓縮。

但那又怎麼樣呢?JPEG的人脈太廣,牢牢把持住了互聯網。直到目前,與JPEG2000兼容的軟件、瀏覽器還是比較少,跟我一樣老,誕生於1992年的JPEG仍然是目前最普遍認可的圖像文件格式,你大爺還是你大爺。

至於HEIF、WEBP等更新的圖像格式,兼容性就更差了。iPhone用戶用windows電腦時對HEIF最大的好奇就是“怎麼才能轉成JPEG”,至於WEBP......一般人下載到這個格式的圖像文件,都以爲自己下錯了,打不開,只能轉過頭去截圖一個JPEG。

所以,JPEG之所以始終是你大爺,固然有自身技術出色的原因,但也是因爲它把握住了歷史的進程。

最後,除了 JPEG 以外,還有另一種格式也很常見:JPG。那 JPEG 和 JPG 有什麼區別?

它們最大的區別,就是JPEG 有四個字母,而 JPG 有三個字母,別的就沒有了。

沒開玩笑。

在 Windows 95 之前,Windows 操作系統最多隻支持三個字符的文件擴展名,所以 JPEG 被縮寫成了 JPG,中間的 E 被省略了。而這種限制在 MAC 等類 UNIX 系統中並不存在,在 Windows 95 之後的操作系統在也不存在,所以 JPG 又可以用回大名 JPEG 了。

就是這樣~