2008年8月12日 星期二

圖像壓縮(二)

續上文,lossy compression的難處,就是要找出‘可抛棄’的資訊。

在繼續討論前,首先要解釋一下電腦是如何紀錄圖像的。大家都會知道光有三原色,即紅、藍、綠。其他顏色都可以由這三原色組合而成(註一)。這便是很多人可理解的RGB(Red Green Blue)系統。電腦會紀錄圖像每個像素(pixel)的紅、藍、綠值。

例如,我們說一部數碼相機是800萬像素的,意思便是照片可以有800萬點(例如3,200X2,400便有七百多萬點),但每個像點要分別紀錄RGB的資料,所以,實際上便需3x800萬即2,400萬個貯存單位!若以1byte為一個貯存單位,一張800萬像素,無壓縮的照片最小也應是24M!

甚麼,從經驗,我們大約知道800萬像素的照片若用jpeg的格式,應是2M左右,這即是說,jpeg格式達成了約10倍的壓縮!現我便用jpeg為例,說明如何進行lossy compression。

RGB系統容易理解,但容易理解的系統未必最有用。為了後文所述的原因,相片在壓縮前,先要轉換成另一個系統。這個轉換其實就是把RGB三個頻道(channel),轉換成一個紀錄光亮度,和兩個紀錄顏色的頻道。這項技術其實一點也不新鮮。它早就用在電視技術上。

我小時候,電視是黑白的,當開發彩色電視時,工程師便面對兼容性問題,這就是要讓原來的黑白電視可繼續使用,所以,彩色電視的標準並是不直接傳送RGB,而是傳送光亮度和兩個頻道的顏色資料。光亮度便以原有的黑白電視標準傳送。黑白電視根本不認識顏色頻道,但仍可繼續運作!(註二)

數碼相機沒有這個兼容問題,先使用這種轉換的原因在於轉換後,數據變得更有實際意義。例如,單看亮度便等如看一張黑白相。但這祗是第一次轉換,jpeg的壓縮原理在於‘變化’的處理。就以影人像為例,先不要理會顏色問題,單從亮度考慮,人面的亮度變化,應該是某程度上的有規律(可以理解成‘漸進’),但從絶對數值,不容易發現這規律。Jpeg便用了一個名為‘Discrete Cosine Transformation’(DCT)的方法,這便可以看到變化而不是絶對值。Jpeg的想法便是人眼不會看到太快的變化,所以,祗要把變化太快(學術上說就是高切濾波)的部份去除,便會出現很多的重覆性,然後便可以加以一般的‘升熵’處理。

何謂‘變化太快’?Jpeg的標準內,這便是質素的問題。去除得越多,檔案便越小,但質素便越低。可以參考附圖的例子。

可以留意到,當壓縮比律定得很高時,照片會出現所謂‘馬賽克’(Mosaic)的現象,其實‘馬賽克’正正是變化不能太快的結果!但更常見的是artifacts,這就是一些類似水波紋的現象!

註一:RGB可以顯示所有顏色是個簡單化的想法。例如,我們永遠都可以分得出顯示屏和印刷品。問題並不是想像中的簡單。

註二:兼容永遠是電腦學和工程學的一個重要議題。很多看似愚蠢的設計,其實都是因為要照顧兼容問題。以後,我會再多舉‘兼容’的例子。








質量指數:100 檔案大小:61462



質量指數:70 檔案大小:18057
和上圖相比,明顯地,檔案小了很多,而質量也沒有大問題



質量指數:25 檔案大小:13123
檔案小了不多,但質量明顯變壞,狗腹部的毛明顯地出現了水波紋



質量指數:20 檔案大小:14724
和上圖相比,檔案大小反而增大,質量更無需多說

沒有留言:

網誌存檔