簡單咁講下啦…
1. 把影像由RGB(紅綠藍)轉換為一種稱為YUV的不同色彩空間
2. YUV 的 Y 表示一個像素的亮度
3. U 和 V 成份一起表示色調與飽和度。
4. 人類的眼睛在 Y 成份可以比 U 和 V 看得更仔細。
5. 因此,U和V 可以只用較低的解像度,X 和 Y 軸都是每 2 點抽 1,這就是 YUV420
6. 把影像分成 8x8 的 block
7. 將每個 pixel 的數值 -128(使 range 由 0-255 變成 -128-127)
8. 將每個 pixel 利用下面的式進行 2D-DCT (Discrete cosine transform)
9. 結果會把主要的資料推到教前的位置,第一個數 (0,0) 為 DC Coeff,期餘為 AC Coeff
10. 把這堆資料量化,除一個 matrix,捨棄小數再捨棄一堆 = 0 的數(這是最主要會做成 loss 的一步)!
11. 那麼,一個 8x8 = 64 個 coeff 的數可以跟據需要,要求的質素,變成只有約 10-30 個 coeff 的一堆數。
12. 把這堆數執行 entropy coding
結果…原本 8bit / pixel 可以變成約 0.3-5 bit / pixel!
一般來說對一張有連續色調變化的相,即沒有太多高頻資訊,JPEG 在 20:1 的壓縮率都沒有明顯的 loss! |