圖片壓縮
阿新 • • 發佈:2018-03-18
分解 fft 運算 image LG 流程 離散余弦變換 哈夫曼 離散
1)一張圖片如何顯示到屏幕上
- 一個電腦顯示器, 上面的像素點就是內存/顯存
- 一張圖片表達的顏色信息賦值到那塊內存就是圖片顯示
2)圖片文件的格式
圖片文件的格式,無論是哪一種,最終都要包含原始顏色數據
原始顏色數據
- 一個像素用rgba 表示,4bytes
- 比如 1000x1000,存32位色,原始大小4M
3)圖片無損壓縮原理
Sliding Window Algorithms
基於滑動窗口緩存的技術,該緩存用於保存最近剛剛處理的文本
例子:lzss
Dictionary Algorithms
通過建立字典,實現字符重用與編碼,適用源碼中重復率高的文本壓縮。
例子:lzw
無損數據壓縮算法的歷史
4)圖片有損壓縮原理
把圖片當做信號,將時域轉頻域,丟棄高頻數據;
信號、時域、頻域
- 一個信號, 原始的波形圖稱為時域圖
- 比如常見的方波,模擬現實生活中的數字信號(01)
- 一個信號(時域)可以用多個正弦波疊加而成
- 傅裏葉變換: 把信號分解成正弦波的疊加
?
圖片的時域轉頻域
- 把圖片當做是信號
- x軸(時間)表示像素點的坐標;
- y軸(值域)表示顏色的值;
- 應用傅裏葉變換, 把信號(時域), 轉成頻域
- 頻域圖表達的是N個正弦波的疊加
- 所以圖片需要存儲的數據量: 正弦波參數的表達(比如4bytes,一個波4個參數) * N
圖片當做信號
對於YUV格式的圖片可以當作: 3條信號
對於RGBA格式的圖片可以當作: 4條信號
為什麽選擇快速傅裏葉變換
傅裏葉變換復雜,電腦算很久
計算機的世界都是模擬的,不需要100%的精度, 快速傅裏葉變換的運算精度是能夠接受的
高頻與低頻
波有頻率, 表示波的周期
周期長的波是低頻率的波; 周期長的波勾勒信號的大致形狀;
周期短的波是高頻率的波; 是一些細節, 丟棄細節相當於降低圖片質量;
所以對於一個頻域, 丟掉高頻的波, 可以進一步壓縮數據;
jpg的壓縮算法
jpg采用DCT(離散余弦變換), 來實現把時域轉成頻域。
jpg采用 (RLE 和 哈夫曼編碼)來進一步壓縮, 無損壓縮。
5)圖片壓縮的流程
- 原始大小:1000x1000 RGBA -> 4M
- rgba 轉 Y_UV -> 2M
- 有損壓縮
- 轉成 8*8 像素格子
- 對於每個格子,時域轉頻域(FFT 或 DCT)
- 丟棄高頻信息
- lzw 無損壓縮 -> ~200k
例子:圖片有損壓縮
圖片壓縮