天天看點

壓縮算法——谷歌WebpWebP适用場景:WebP如何工作什麼是 WebP?Webp CompressionTechniques其他:為什麼WebP(有損)比JPEG更好無損WebP參考Link:

WebP适用場景:

WebP是一種現代的圖像格式,為網絡上的圖像提供優異的無損和有損壓縮。使用WebP,網站管理者和網絡開發人員可以建立更小,更豐富的圖像,使網絡更快。

WebP無損圖像的大小比PNG 小26%。WebP有損圖像比同等SSIM品質指數下的可比JPEG圖像 小25-34%。WebP lossyimages are 25-34% smaller than comparable JPEG images at equivalent SSIMquality index.

在Google,我們一直在探索如何加快網頁加載速度。一種方式是通過使web圖像更小。圖像在大多數網頁上占據高達 60%-65%的位元組,頁面大小是總繪制時間的主要因素。頁面大小對移動裝置尤其重要,其中較小的圖像可節省帶寬和電池壽命。

WebP是由Google開發的一種新的圖像格式,支援Chrome,Opera和Android,經過優化,可以在網絡上實作更快,更小的圖像。與同等視覺品質的PNG和JPEG圖像相比,WebP圖像的大小要小30%左右。此外,WebP圖像格式還具有與其他格式的功能奇偶校驗。它支援:

  • 有損壓縮:有損壓縮基于 VP8關鍵幀編碼。VP8是由On2Technologies作為VP6和VP7格式的後續産品建立的視訊壓縮格式。
  • 無損壓縮:無損壓縮格式由WebP團隊開發。
  • 透明度: 8位Alpha通道對于圖形圖像非常有用。Alpha通道可與有損RGB一起使用,這是目前無法與任何其他格式一起使用的功能。
  • 動畫:它支援真彩色動畫圖像。
  • 中繼資料:它可能有EXIF和XMP中繼資料(例如錄影機使用)。
  • 顔色配置檔案:它可能有一個嵌入的ICC配置檔案。

由于更好的壓縮圖像和支援所有這些功能,WebP可以很好地替代大多數圖像格式:PNG,JPEG或GIF。

WebP如何工作

有損WebP壓縮使用預測編碼來編碼圖像,VP8視訊編解碼器使用相同的方法來壓縮視訊中的關鍵幀。預測編碼使用相鄰像素塊中的值來預測塊中的值,然後僅對差異進行編碼。 

什麼是 WebP?

WebP(發音 weppy),是一種支援有損壓縮和無損壓縮的圖檔檔案格式,派生自圖像編碼格式 VP8。根據 Google 的測試,無損壓縮後的 WebP 比 PNG 檔案少了 45%的檔案大小,即使這些 PNG 檔案經過其他壓縮工具壓縮之後,WebP 還是可以減少 28%的檔案大小。

PNG 轉 WebP 的壓縮率要高于 PNG 原圖壓縮率,同樣支援有損與無損壓縮

轉換後的 WebP 體積大幅減少,圖檔品質也得到保障(同時肉眼幾乎無法看出差異)

轉換後的 WebP 支援 Alpha 透明和 24-bit 顔色數,不存在 PNG8 色彩不夠豐富和在浏覽器中可能會出現毛邊的問題

WebP 的優勢展現在它具有更優的圖像資料壓縮算法,能帶來更小的圖檔體積,而且擁有肉眼識别無差異的圖像品質;同時具備了無損和有損的壓縮模式、Alpha 透明以及動畫的特性,在 JPEG 和 PNG 上的轉化效果都非常優秀、穩定和統一。

WebP始于視訊。WebP的誕生有些巧合。谷歌最初開發一種稱作WebM的視訊格式,這種格式是基于其VP8視訊解碼器。

但Facebook發現,使用者不僅在網站中浏覽好友的照片,而且下載下傳照片,然後通過電子郵件分享照片,有的使用者甚至還列印照片。部分Facebook使用者就發現,自己常用的應用無法打開.webp格式檔案。Facebook不得不再次提供JPEG檔案,谷歌迅速作出回應,讓桌面版Chrome成為WebP檔案的預設浏覽器。

WebP還會增加伺服器的負擔。相較編碼JPEG檔案,編碼同樣品質的WebP檔案需要占用更多的計算資源。

Webp CompressionTechniques

有損WebP基于VP8視訊編碼中的預測編碼方法來壓縮圖像資料,其基本步驟類似于JPEG壓縮,主要包含格式轉換、分割子塊、預測編碼、FDCT、量化、Z排列、熵編碼,流程如下圖所示,紅色代表與JPEG不同的部分。

壓縮算法——谷歌WebpWebP适用場景:WebP如何工作什麼是 WebP?Webp CompressionTechniques其他:為什麼WebP(有損)比JPEG更好無損WebP參考Link:

編碼原理圖

1) 格式轉換

若壓縮前圖像資料為RGB格式,則需先進行格式轉換成YUV格式,Y表示亮度分量,UV表示色度分量。之是以轉換成YUV格式是因為人類視覺對亮度遠比色度敏感,是以可通過适當減少色度資料的存儲來節省資料占用的空間,但卻不會對視覺效果造成太大影響,如可每兩個或四個相鄰的像素點才儲存一對UV值。

2) 分割宏塊

接下來将資料分割成一個個8x8或16x16的宏塊。

3)  預測編碼

預測編碼與VP8幀内預測相同。VP8的幀内預測基本上是從H.264标準照搬過來的:子塊(subblock)預測模式基本上和H.264的i4×4模式完全一緻;并且,整塊預測模式和i16×16模式一緻。色度的預測模式從經驗上說也和H.264一樣。H.264 High profile中定義的i8×8模式沒有出現在VP8中。另一個差別在于H.264的平面預測模式在VP8中被替換成了TM_PRED,這是一個非常含糊的近似模拟。就特定的預測模式而言,VP8和H.264有細微的差别,但是他們都和H.264有着一樣的名字。

VP8幀内預測模式與三種類型的宏塊一起使用:

4x4 luma

16x16 luma

8x8色度

宏塊裡每個4x4的子塊都有一個預測模型。(又名過濾)。在PNG裡過濾用得非常多,它對每一行都做同樣的事,而WebP過濾的是每一塊。它是這樣處理的,在一個塊周圍定義兩組像素:有一行在它上面為A,在它左邊那一列為L。

壓縮算法——谷歌WebpWebP适用場景:WebP如何工作什麼是 WebP?Webp CompressionTechniques其他:為什麼WebP(有損)比JPEG更好無損WebP參考Link:

利用A和L,編碼器會将它們放在一個4x4的測試像素塊填滿,并确定哪一個生成了最接近原始塊的值。這些用不同方法填滿的塊叫做"預測塊"。

這些宏塊共享四個常見的幀内預測模式:

壓縮算法——谷歌WebpWebP适用場景:WebP如何工作什麼是 WebP?Webp CompressionTechniques其他:為什麼WebP(有損)比JPEG更好無損WebP參考Link:

H_PRED(水準預測)。用左列L的副本填充塊的每一列。

V_PRED(垂直預測)。用上面行A的副本填充塊的每一行。

DC_PRED(DC預測)。使用A上方行中的像素的平均值和L左邊的列填充塊,使用單個值。

TM_PRED(TrueMotion預測)。一種從On2Technologies開發的壓縮技術獲得其名稱的模式。除了行A和列L之外,TM_PRED使用塊上方和左側的像素P. A中的像素之間的水準差(從P開始)使用從L到L的像素來傳播,以開始每一行。

對于4×4亮度塊,存在類似于V_PRED和H_PRED的六個額外幀内模式,但對應于在不同方向上預測像素。

如上所述,TM_PRED模式對于VP8是唯一的。下圖使用示例4x4像素塊來說明TM_PRED模式的工作原理:

壓縮算法——谷歌WebpWebP适用場景:WebP如何工作什麼是 WebP?Webp CompressionTechniques其他:為什麼WebP(有損)比JPEG更好無損WebP參考Link:

其中C,A s和L s表示來自先前編碼塊的重建像素值,并且X 00至X 33表示目前塊的預測值。TM_PRED使用以下等式來計算X ij:

X ij = L i + A j-C(i,j = 0,1,2,3)

雖然上述示例使用4x4塊,但是8x8和16x16塊的TM_PRED模式以相同的方式工作。

TM_PRED是VP8中更頻繁使用的幀内預測模式之一,并且對于公共視訊序列,其通常被幀内編碼的所有塊的20%至45%使用。總體上,與其它幀内預測模式一起,TM_PRED幫助VP8實作非常好的壓縮效率,特别是對于隻能使用幀内模式(關鍵幀本身不能參考先前編碼的幀)的關鍵幀。

4) FDCT

FDCT(Forward Discrete Cosine Transform,正向離散餘弦變換)是将一組空間域的像素點轉變成頻域中的系數,對每個宏塊執行FDCT,使得變換後資料的低頻部分分布在資料塊的左上方,高頻部分集中在右下方,其中左上角第一個系數稱為直流系數,其他均為交流系數。

5) 量化

量化是壓縮中損失資料的主要步驟,它主要原理是把經過DCT變換後的宏塊中每個數值除以量化表中對應的系數并取整。其中量化表中高頻部分對應的系數比低頻部分系數要大得 多,則在經過量化後,高頻部分的頻率系數被大大衰減甚至許多被清零,而低頻部分的頻率系數則較好地被保留。由于人眼對低頻部分更敏感,是以經過量化後再還原成圖像對視覺效果影響較小,但資料得到有效的壓縮。量化的最終目的是減少低頻部分非零系數的幅值并增加高頻部分零值系數的數量。

6) Z排列

為更便于後續的編碼,需在編碼前對資料塊進行重新的排列,使得低頻部分的資料排在前面,高頻部分的資料排在後面,以增加數組中連續零值的數量,是以采用一種Z字型的排列方式。

7) DPCM

可用DPCM(DifferentialPulse Code Modulation,差分脈沖編碼調制)對直流系數進行編碼。由于直流系數的數值較大,且相鄰資料塊的直流系數相差不大,是以可使用DPCM對相鄰資料塊間量化後的直流系數內插補點進行編碼,進而提高壓縮比。 

8) 行程編碼

行程編碼是一種根據相同資料重複多次的情況簡化表示的算法,例如1111222222333按照行程編碼表示為(1,4)(2,6)(3,3)。由于量化後的交流系數中包含較多連續零值系數,是以可用行程編碼對它們進行編碼來有效壓縮資料長度。

9) 熵編碼

熵編碼是一種無損資料壓縮編碼方式,WebP中采用布爾算術編碼作為熵編碼方式。和其它熵編碼方法不同的地方在于,其他的熵編碼方法通常是把輸入的消息分割為符号,然後對每個符号進行編碼,而算術編碼是直接把整個輸入的消息編碼為一個數,一個滿足(0.0 ≤ n < 1.0)的小數n。消息越長,編碼表示它的間隔就越小,表示這一間隔所需的二進制位就越多。

其他:

1.    自适應塊量化

為了提高圖像的品質,将圖像分割成具有明顯相似特征的區域。對于這些段中的每一個,獨立地調整壓縮參數(量化步長,濾波強度等)。這通過将位重新配置設定到它們最有用的位置來産生有效的壓縮。VP8允許最多四個段(VP8比特流的限制)。

2.    環路濾波用于消除由來自塊變換的DCT系數的量化引入的塊效應

為什麼WebP(有損)比JPEG更好

預測編碼是WebP勝過JPEG的主要原因。塊自适應量化也有很大的差別。過濾有助于中/低位速率。與霍夫曼編碼相比,布爾算術編碼提供5%-10%的壓縮增益。

無損WebP

WebP無損編碼基于使用幾種不同技術變換圖像。然後,對變換參數和變換後的圖像資料執行熵編碼。應用于圖像的變換包括像素的空間預測,顔色空間變換,使用局部出現的調色闆,将多個像素打包到一個像素中,以及α替換。對于熵編碼,我們使用LZ77-Huffman編碼的變體,其使用距離值和緊湊稀疏值的2D編碼。

WebP 格式:WebP容器規範_WebP _ Google開發人員.htm

參考Link:

https://developers.google.com/speed/webp/docs/compression

https://zhuanlan.zhihu.com/p/23648251

http://www.jianshu.com/p/555859783f63 webp的工作原理

http://blog.csdn.net/zhangcanyan/article/details/51842211

http://www.tuicool.com/articles/FFZ73y

繼續閱讀