1. 程式人生 > >圖片壓縮

圖片壓縮

分解 fft 運算 image LG 流程 離散余弦變換 哈夫曼 離散

1)一張圖片如何顯示到屏幕上

  • 一個電腦顯示器, 上面的像素點就是內存/顯存
  • 一張圖片表達的顏色信息賦值到那塊內存就是圖片顯示

2)圖片文件的格式

圖片文件的格式,無論是哪一種,最終都要包含原始顏色數據

原始顏色數據

  • 一個像素用rgba 表示,4bytes
  • 比如 1000x1000,存32位色,原始大小4M

3)圖片無損壓縮原理

Sliding Window Algorithms
基於滑動窗口緩存的技術,該緩存用於保存最近剛剛處理的文本
例子:lzss

Dictionary Algorithms
通過建立字典,實現字符重用與編碼,適用源碼中重復率高的文本壓縮。
例子:lzw

無損數據壓縮算法的歷史

4)圖片有損壓縮原理

把圖片當做信號,將時域轉頻域,丟棄高頻數據;

信號、時域、頻域

  • 一個信號, 原始的波形圖稱為時域圖
  • 比如常見的方波,模擬現實生活中的數字信號(01)
  • 一個信號(時域)可以用多個正弦波疊加而成
  • 傅裏葉變換: 把信號分解成正弦波的疊加

技術分享圖片?

圖片的時域轉頻域

  1. 把圖片當做是信號
    • x軸(時間)表示像素點的坐標;
    • y軸(值域)表示顏色的值;
  2. 應用傅裏葉變換, 把信號(時域), 轉成頻域
  3. 頻域圖表達的是N個正弦波的疊加
  4. 所以圖片需要存儲的數據量: 正弦波參數的表達(比如4bytes,一個波4個參數) * N

圖片當做信號

對於YUV格式的圖片可以當作: 3條信號
對於RGBA格式的圖片可以當作: 4條信號

為什麽選擇快速傅裏葉變換

傅裏葉變換復雜,電腦算很久
計算機的世界都是模擬的,不需要100%的精度, 快速傅裏葉變換的運算精度是能夠接受的

高頻與低頻

波有頻率, 表示波的周期
周期長的波是低頻率的波; 周期長的波勾勒信號的大致形狀;
周期短的波是高頻率的波; 是一些細節, 丟棄細節相當於降低圖片質量;
所以對於一個頻域, 丟掉高頻的波, 可以進一步壓縮數據;

jpg的壓縮算法

jpg采用DCT(離散余弦變換), 來實現把時域轉成頻域。
jpg采用 (RLE 和 哈夫曼編碼)來進一步壓縮, 無損壓縮。

5)圖片壓縮的流程

  1. 原始大小:1000x1000 RGBA -> 4M
  2. rgba 轉 Y_UV -> 2M
  3. 有損壓縮
    • 轉成 8*8 像素格子
    • 對於每個格子,時域轉頻域(FFT 或 DCT)
    • 丟棄高頻信息
  4. lzw 無損壓縮 -> ~200k

例子:圖片有損壓縮

圖片壓縮