JPEG算法解密


 圖片壓縮有多重要,可能很多人可能並沒有一個直觀上的認識,舉個例子,一張800X800大小的普通圖片,如果未經壓縮,大概在1.7MB左右,這個體積如果存放文本文件的話足夠保存一部92萬字的鴻篇巨著《紅樓夢》,現如今互聯網上絕大部分圖片都使用了JPEG壓縮技術,也就是大家使用的jpg文件,通常JPEG文件相對於原始圖像,能夠得到1/8的壓縮比,如此高的壓縮率是如何做到的呢?
        JPEG能夠獲得如此高的壓縮比是因為使用了有損壓縮技術,所謂有損壓縮,就是把原始數據中不重要的部分去掉,以便可以用更小的體積保存,這個原理其實很常見,比如485194.200000000001這個數,如果我們用485194.2來保存,就是一種“有損”的保存方法,因為小數點后面的那個“0.000000000001”屬於不重要的部分,所以可以被忽略掉。JPEG整個壓縮過程基本上也是遵循這個步驟:
        1. 把數據分為“重要部分”和“不重要部分”
        2. 濾掉不重要的部分
        3. 保存
步驟一:圖像分割


        JPEG算法的第一步,圖像被分割成大小為8X8的小塊,這些小塊在整個壓縮過程中都是單獨被處理的。后面我們會以一張非常經典的圖為例,這張圖片名字叫做Lenna,據說是世界上第一張JPG圖片,這張圖片自從誕生之日開始,就和圖像處理結下淵源,陪伴了無數理工宅男度過了的一個個不眠之夜,可謂功勛卓著,感興趣的朋友可以在這里了解到這張圖片的故事。

步驟二:顏色空間轉換RGB->YCbCr


        所謂“顏色空間”,是指表達顏色的數學模型,比如我們常見的“RGB”模型,就是把顏色分解成紅綠藍三種分量,這樣一張圖片就可以分解成三張灰度圖,數學表達上,每一個8X8的圖案,可以表達成三個8X8的矩陣,其中的數值的范圍一般在[0,255]之間。


R

>

G

>

B

>

        不同的顏色模型各有不同的應用場景,例如RGB模型適合於像顯示器這樣的自發光圖案,而在印刷行業,使用油墨打印,圖案的顏色是通過在反射光線時產生的,通常使用CMYK模型,而在JPEG壓縮算法中,需要把圖案轉換成為YCbCr模型,這里的Y表示亮度(Luminance),Cb和Cr分別表示綠色和紅色的“色差值”。

        “色差”這個概念起源於電視行業,最早的電視都是黑白的,那時候傳輸電視信號只需要傳輸亮度信號,也就是Y信號即可,彩色電視出現之后,人們在Y信號之外增加了兩條色差信號以傳輸顏色信息,這么做的目的是為了兼容黑白電視機,因為黑白電視只需要處理信號中的Y信號即可。
        根據三基色原理,人們發現紅綠藍三種顏色所貢獻的亮度是不同的,綠色的“亮度”最大,藍色最暗,設紅色所貢獻的亮度的份額為KR,藍色貢獻的份額為KB,那么亮度為

(1.1)

       根據經驗,KR=0.299,KB=0.114,那么

(1.2)

        藍色和紅色的色差的定義如下

(1.3)

(1.4)

       最終可以得到RGB轉換為YCbCr的數學公式為

(1.5)

       YCbCr模型廣泛應用在圖片和視頻的壓縮傳輸中,比如你可以留意一下電視或者DVD后面的接口,就可以發現色差接口。

       這是有道理的,還得我們在文章開始時提到的有損壓縮的基本原理嗎?有損壓縮首先要做的事情就是“把重要的信息和不重要的信息分開”,YCbCr恰好能做到這一點。對於人眼來說,圖像中明暗的變化更容易被感知到,這是由於人眼的構造引起的。視網膜上有兩種感光細胞,能夠感知亮度變化的視桿細胞,以及能夠感知顏色的視錐細胞,由於視桿細胞在數量上遠大於視錐細胞,所以我們更容易感知到明暗細節。比如說下面這張圖

Y



Cb



Cr



        可以明顯看到,亮度圖的細節更加豐富。JPEG把圖像轉換為YCbCr之后,就可以針對數據得重要程度的不同做不同的處理。這就是為什么JPEG使用這種顏色空間的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM