04.16 有圖有真相:以為了解JPG圖,你太天真!

原文作者,David Austin,大峽谷州立大學。

翻譯作者,小漣貓,哆嗒數學網翻譯組成員。

校對,333。

關注微信:哆嗒數學網 每天獲得更多數學趣文

新浪微博:http://weibo.com/duodaa

下面這張圖片以矩陣形式包含了3871488個像素。每個像素的顏色由紅綠藍分量決定,每種顏色佔一字節內存,我們可能想當然地認為,這個圖片會佔11614464字節內存,但是這個JPEG 文件實際只佔734268字節內存,約為原來十六分之一。下面我們將會介紹這種由聯合圖像專家小組(JPEG)開發的高效圖像壓縮算法。

有圖有真相:以為了解JPG圖,你太天真!

相比專門使用紅綠藍三種顏色分量,用另外三種不同的分量來描述會更方便:亮度Y, 與顏色明亮程度密切相關;C_b、C_r為藍色、紅色色度分量,它們可以粗略地確定一個色彩。上述兩種表示方法可以通過一個可逆的仿射變換實現相互轉換。例如,為重新獲得紅、綠、藍分量的值,我們可以用以下公式:

可以看出,亮度與三種基本顏色分量的作用相同。為了可視化這個變換,我們保持亮度不變並且混合各類色度值得到以下顏色

這個算法將圖片分割為8*8的可單獨處理的圖像塊,這是一個樣本模塊。

在我們的樣本模塊中,(Y,C_b,C_r)三種分量的分佈情況如下,明亮的區域對應更大的數值。

有圖有真相:以為了解JPG圖,你太天真!

可以看出亮度值Y產生的是原圖的灰度圖。心理可視化實驗表明,人眼對亮度變化最為敏感,因此對顏色轉換時可以把最重要的信息壓縮到單個分量中。彩電使用相似的顏色模型,它能讓黑白電視也可以有效播放貌似彩色效果的圖像。

原因稍後解釋,現在我們用一些頻率越來越塊的餘弦函數的線性組合求表示各個分量值。例如,如果Y_ x,y 代表圖像塊中的第x 行,第y 列的方塊處的亮度,就可以表示為

有圖有真相:以為了解JPG圖,你太天真!

歸一化常數C_u,v 不需過分關注; 係數F_u,v由二維離散餘弦變換(DCT)得到,而對於它的高效計算則可以採用快速傅立葉變換(FFT)。

有圖有真相:以為了解JPG圖,你太天真!

大多數圖像塊的分量值不會急劇改變,人眼對這些變化也不是很敏感,因此,頻率較高的DCT 變換系數可能很小甚至忽略也不影響對我們對於圖像的感知。這樣的觀察啟迪了我們,也許可以以整數的形式來量化DCT的係數並加以存儲。

量化過程涉及兩個要素。第一個為參數α,它由使用者選擇,用於控制壓縮程度與圖片質量。α值越大,文件越小,圖片質量也就越差。

第二個因素是一個8*8的矩陣Q=[Q_u,v],其中的係數為對F_u,v /αQ_u,v取整後的值, 依經驗選取Qu,v時,為了弱化高頻的影響,通常對於高頻部分賦予較大的數值。例如,一個用於量化亮度離DCT係數的矩陣為

有圖有真相:以為了解JPG圖,你太天真!

考慮到亮度攜帶更多重要的視覺信息,所以我們用不同的矩陣來分別量化描述亮度的係數與描述色調的係數。用中間值α處理我們的樣本圖像塊,量化後的亮度係數如下

有圖有真相:以為了解JPG圖,你太天真!

量化後的係數按照箭頭指向排序,低頻排在前面。

有圖有真相:以為了解JPG圖,你太天真!

樣本的亮度分量,其量化後的係數為數列 7, -2, 4, 1, 0, 1, 0, 1, -1以及55個0。相比存儲這麼多數字零,我們直接記錄零的個數,這樣極大減少了存儲需求。後續的壓縮要依靠哈夫曼編碼來實現係數數列的高效效存儲。

圖像的重建可以通過逆過程實現。量化係數給出了F_u,v的近似值,這些反過來又給出了Y, C_b , C_r和R,G,B 分量的值。下圖中左圖表示原圖,右邊則是重建後的圖。

有圖有真相:以為了解JPG圖,你太天真!

DFT似乎比DCT 更好用,因為它易於計算。但是我們卻選擇了DCT,這是因為我們希望把信息儘量集中到頻率較低的係數上。以8*8模塊中的某一行Y_x的值為例, DFT方法將Y_x表示為一些週期為8的函數的線性組合,並由此給出了Y_x的一個週期延拓。但該變換非常不必要地將 y_7 與 y_8 = y_0之間的變化也記錄下來了,這就導致了高頻分量的加入以及由此產生的顯著影響。在下面的圖中,Y_x 值用黑色表示,而由傅立葉變換的三個最低頻項所給出的近似值是用紅色表示的。

有圖有真相:以為了解JPG圖,你太天真!

與之相比,DCT方法將Yx表示為一些週期為16且關於x=7.5對稱的函數的線性組合。這使得Y_x的近似延拓更為平滑,從而減少了對高頻分量的依賴。下圖是DCT所給出的近似值,注意到近似效果得到了顯著改善。

有圖有真相:以為了解JPG圖,你太天真!

因為這些8*8圖像塊都是被獨立處理,所以這就導致了在高壓縮率的情況下邊緣部分的不連續性變得十分明顯。除此之外,我們通常還希望用中等分辨率就能高效重建圖像。這些因素以及一些其他原因,促使了JPEG2000壓縮算法的產生。在諸多不同點中,JPEG2000還採用離散小波變換代替了DCT

JPEG2000算法把圖像分割為尺寸更加精細的圖像塊,比如256*256。為了演示小波變換,取圖像塊中的一行像素並令y_x 代表該行中的某一個值。現在求小波係數。

有圖有真相:以為了解JPG圖,你太天真!

h_x為能夠檢測到高頻變化的高通係數,l_x為低通係數。按照低通係數在前高通係數在後的順序進行排序,對列也做相同處理後,可得小波係數的數表。

有圖有真相:以為了解JPG圖,你太天真!

位於LL子塊中的係數是通過對所有2*2的鄰近像素點取平均值得到的因此代表了一個低分辨率的圖像。另外三個子塊描述了當重建高分辨率圖像時所必要的變換。我們對LL子塊重複之前的處理,從而實現以越來越低的分辨率存儲圖像。

有圖有真相:以為了解JPG圖,你太天真!

量化的過程會檢測數值變化不明顯的區域,從而可以安全地忽略高通係數。和之前介紹的小波變換求取兩個相鄰值的平均值不同的是,JPEG2000算法使用Cohen-Daubechies Feauveau (9, 7) 小波變換,它可實現取鄰近九個值的平均值,這樣可令圖像更加平滑。

JPEG2000的算法複雜度比JPEG高一個數量級,而且在中、低壓縮率時,圖像質量並沒有優化多少。但是在高壓縮率情況下,JPEG算法採用的8*8圖像塊會導致圖片質量嚴重下降,而JPEG2000的效果此時會明顯更好。

因為JPEG2000在獲取同等質量圖像時更為費勁,所以它對JPEG來說並沒有明顯優勢。事實上,目前只有少數網站支持顯示JPEG2000圖像。它的優勢在於,當處於增加算法複雜度不再是問題的環境下,可以為圖像提供靈活的格式。

例如利用小波變換能以不同分辨率有效重組圖像,用戶可肉眼迅速大量搜索低分辨率的圖片。JPEG2000允許用戶指定區域以高分辨率展示,通常是出於醫學成像的需要。最後,它也使得數碼圖像能以JPEG2000的格式存儲在相機內存卡中,這樣在拍照後,圖片會以低分辨率存儲起來以減少內存使用。在JPEG面世約十年後,JPEG2000才出現。它還擁有一些其他的功能特性,比如事後圖像加密的功能。

關注微信:哆嗒數學網 每天獲得更多數學趣文

新浪微博:http://weibo.com/duodaa


分享到:


相關文章: