今天小編分享的健康經驗:你大爺永遠是你大爺!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 仍然是目前最普遍認可的影像檔案格式,你大爺還是你大爺。
所以,JPEG 之所以始終是你大爺,固然有自身技術出色的原因,但也是因為它把握住了歷史的進程。
最後,除了 JPEG 以外,還有另一種格式也很常見:JPG。那 JPEG 和 JPG 有什麼區别?
它們最大的區别,就是 JPEG 有四個字母,而 JPG 有三個字母,别的就沒有了。
沒開玩笑。
在 Windows 95 之前,Windows 作業系統最多只支持三個字元的檔案擴展名,所以 JPEG 被縮寫成了 JPG,中間的 E 被省略了。而這種限制在 MAC 等類 UNIX 系統中并不存在,在 Windows 95 之後的作業系統在也不存在,所以 JPG 又可以用回大名 JPEG 了。
就是這樣 ~