DCT變換的基本思路是將圖像分解為8×8的子塊或16×16的子塊,並對每一個子塊進行單獨的DCT變換,然后對變換結果進行量化、編碼。隨着子塊尺寸的增加,算法的復雜度急劇上升,因此,實用中通常采用8×8的子塊進行變換,但采用較大的子塊可以明顯減少圖像分塊效應。
在圖像壓縮中,一般把圖像分解為8×8的子塊,然后對每一個子塊進行DCT變換、量化,並對量化后的數據進行Huffman編碼。DCT變換可以消除圖像的空間冗余,Huffman編碼可以消除圖像的信息熵冗余。
DCT 是無損的,它只將圖像從空間域轉換到變換域上,使之更能有效地被編碼。對一個圖像子塊而言,將對變換后的6?個系數進行量化,並對Z字順序掃描系數表進行 編碼。這種排列方法有助於將低頻非0系數置於高頻系數之前,直流系數由於包含了所有圖像特征中的關鍵部分而被單獨編碼。量化后的系數經過熵編碼進一步無損 壓縮,通常采用的是Huffman編碼。這種壓縮編碼方法中,圖像質量的降低主要是由於對系數的量化造成,且不可恢復。假設子圖像為f(x, y),則DCT變換可以由下面的公式實現:
其中式(1)的f(u, v)表示變換域的高頻成分,也稱為交流系數;式(2)中F(0, 0)表示變換域中的低頻成分,也稱為直流系數。對變換結果進行分析,可以看出能量主要集中到左上角。DCT變換具有良好的去相關特性。在圖像的壓縮編碼中,N一般取8。
在解碼時首先得到各點的DCT系數,然后根據下面的DCT反變換即可恢復出原圖像。DCT的反變換公式為:
利用公式(3)可以無損地恢復原圖像。在實際的應用中,使用DCT變換的矩陣描述形式更容易理解。
基於系數重要性的分層編碼
按照上面的方法對圖像變換之后的系數進行編碼,產生的碼流不具有分層的特性,因而不具有分級傳輸的能力。為了實現分層壓縮,我們對變換后的系數進行重新排列(見圖1),再進行支持分級傳輸特性的編碼。
由上面圖中的方法可知,變換后能量集中到變換域的左上角。因此基於DCT變換的 圖像壓縮方法是對系數采用“Z”字型掃描的方式處理。為了實現分層編碼,我們將這些系數重新排列,然后進行分層次的編碼:左上角的4個系數作為基本層的數 據;左上角16個系數作為第一增強層的數據,這16個系數是除基本層中的四個系數以外的其余系數;從16-47的數據作為第二增強層的數據;其余的16個 系數作為第三增強層數據。
經過重排並進行分層壓縮之后,在各個層次上進行測試可以發現,在只傳輸基本層時可提供峰值信噪比為23.23dB以上的圖像;增加一個增強層,圖像的峰值信噪比強達到28.9dB以上;如果加入第二個增強層,恢復圖像的峰值信噪比可以達到37.35dB。
采用這種方法,通過對DCT變換后 的系數按照其重要性進行取舍,可以非常方便地實現圖像序列的分層壓縮和分級傳輸,大大提高壓縮算法對不同傳輸通道的適應能力,並兼顧到幀內圖像質量與幀速 率。在一般的應用場合下,只傳輸第一增強層的數據即可達到較好的視覺效果,此時需要熵編碼的數據量已經減少為原數據量的1/4,通過熵編碼的方法,可以獲 得很高的壓縮比。
、
http://www.ed-china.com/ART_8800012576_400002_500004_TS_8425a4e3.HTM
離散余弦變換(DCT)
離散余弦變換DCT (Discrete Cosine Transform)是數碼率壓縮需要常用的一個變換編碼方法。任何連續的實對稱函數的付立葉變換中只含余弦項,因此余弦變換與付立葉變換一樣有明確的物 理意義。DCT是先將整體圖像分成N*N像素塊,然后對N*N像素塊逐一進行DCT變換。由於大多數圖像的高頻分量較小,相應於圖像高頻分量的系數經常為 零,加上人眼對高頻成分的失真不太敏感,所以可用更粗的量化。因此,傳送變換系數的數碼率要大大小於傳送圖像像素所用的數碼率。到達接收端后通過反離散余 弦變換回到樣值,雖然會有一定的失真,但人眼是可以接受的。二維正反離散余弦變換的算式:
其中N是像塊的水平、垂直像素數,一般取N=8。N大於8時效率增加不多而復雜性大為增加。8*8的二維數據塊經DCT后變成8*8個變換系數,這些系 數都有明確的物理意義。譬如當U=0,V=0時F(0,0)是原64個樣值的平均,相當於直流分量,隨着U,V值增加,相應系數分別代表逐步增加的水平空 間頻率和垂直空間頻率分量的大小。當我們先只考慮水平方向上一行數據(8個像素)的情況時,如圖1所示:
可見圖像信號被分解成為直流成分;以及從低頻到高頻的各種余弦成分;而DCT系數只是表示了該種成分所占原圖像信號的份額大小;顯然,恢復圖像信息可以表示為這樣一個矩陣形式:F(n)=C(n)*E(n)
式中E(n)是一個基底 ,C(n)是DCT系數,F(n)則是圖像信號。
如果再考慮垂直方向上的變化,那么,就需要一個二維的基底,即該基底不僅要反映水平方向頻率的變化;而且要反映垂直空間頻率的變化;對應於8*8的像素 塊;其空間基底如圖2所示:它是由64個像素值所組成的圖像,通常也稱之為基本圖像。把它們稱為基本圖像是因為在離散余弦變換的反變換式中,任何像塊都可 以表示成64個系數的不同大小的組合。既然基本圖像相當於變換域中的單一的系數,那么任何像元也可以看成由64個不同幅度的基本圖像的組合。這與任何信號 可以分解成基波和不同幅度的諧波的組合具有相同的物理意義。
圖2給出了一個對8*8像塊進行DCT變換的具體例子:
在如圖3所示的實例中,可以看出:經過一次DCT變換計算后,64個樣值仍然得到64個系數,本身碼率並沒有壓縮;但是,經DCT變換后,比特數卻增加 了。原樣值是8比特,數據從0~255;得到的F10即直流分量的最大值是原來256的64/8份,即0~2047,交流分量的范圍是- 1024~1023;但經過第2個步驟,即量化之后(圖中△:4),大多數高頻分量的系數變為0,一般說來,人眼對低頻分量比較敏感,對高頻分量則不太敏 感;因而量化的結果是去掉了不太重要的高頻分量,降低了碼率。再通過“之”字型(Zig-Zag)方式讀出數據,這樣讀出也可以減少碼率。因為經DCT變 換以后,系數大多數集中在左上角,即低頻分量區,因此“之”字型讀出實際上是按二維頻率的高低順序讀出系數的。這樣就便於采用游程長度編碼(Run Length Encoding),所謂游程長度編碼是指一個碼可以同時表示碼的值和前面有幾個零。這樣就發揮了“之”字型讀出的優點,因為“之”字型讀出,出現連零的 機會比較多,特別到最后,如果都是零,在讀到最后一個數后,只要給出“塊結束”(EOB)碼,就可以結束輸出,因此節省了很多碼率。
//////////////////////////////////////////////////////////////////
離散余弦變換(Discrete Cosine Tranform,簡稱DCT)是一種與傅立葉變換緊密相關的數學運算。在傅立葉級數展開式中,如果被展開的函數式是偶函數,那么其傅立葉級數中只包含余弦項,再將其離散化可導出余弦變換,因此稱之為離散余弦變換。時間域中信號需要許多數據點表示;在x軸表示時間,在y軸表示幅度。信號一旦用傅立葉變換轉換到頻率域,就只需要幾點就可以表示這個相同的信號。如我們已經看到的那樣,原因就是信號只含有少量的頻率成分。這允許在頻率域中只用幾個數據點就可以表示信號,而在時間域中表示則需要大量數據點。
這一技術可以應用到彩色圖像上。彩色圖像有像素組成,這些像素具有RGB彩色值。每個像素都帶有x,y坐標,對每種原色使用8x8或者16x16矩陣。在灰度圖像中像素具有灰度值,它的x,y坐標由灰色的幅度組成。為了在JPEG中壓縮灰度圖像,每個像素被翻譯為亮度或灰度值。為了壓縮RGB彩色圖像,這項工作必須進行三遍,因為JPEG分別得處理每個顏色成分,R成分第一個被壓縮,然后是G成分,最后是B成分。而一個8x8矩陣的64個值,每個值都帶有各自的x,y坐標,這樣我們就有了一個像素的三維表示法,稱作控件表達式或空間域。通過DCT變換,空間表達式就轉化為頻譜表達式或頻率域。從而到達了數據壓縮的目的。
DCT式目前最佳的圖像變換,它有很多優點。DCT是正交變換,它可以將8x8圖像空間表達式轉換為頻率域,只需要用少量的數據點表示圖像;DCT 產生的系數很容易被量化,因此能獲得好的塊壓縮;DCT算法的性能很好,它有快速算法,如采用快速傅立葉變換可以進行高效的運算,因此它在硬件和軟件中都容易實現;而且DCT算法是對稱的,所以利用逆DCT算法可以用來解壓縮圖像。
為什么采用8x8的圖像塊,其原因是由於計算量和像素之間關系的數量,許多研究表明,在15或20個像素之后,像素間的相關性開始下降。就是說,一列相似的像素通常會持續15到20個像素那么長,在此之后,像素就會改變幅度水平(或反向)。
模擬圖像經采樣后成為離散化的亮度值然后分成一個個宏塊,而一個宏塊有分成8x8大小的塊,可以用一個矩陣來表示這個塊。
![]() |
在這里,N=8,矩陣中元素f(i,j)表示塊中第i行、第j列像素的亮度值。把該矩陣看作一個空間域,顯然,塊中這些亮度值的大小有一定的隨機性,無序性,或者說亮度值的分布沒有什么特征;DCT變換就是來解決這個問題的,把這些隨機的數據變的有序,便於對數據進行編碼壓縮。
一維DCT正交變換的公式為:
![]() |
二維DCT逆變換公式:
![]() |
其中
![]() |
對於一維DCT變換,需要N2次乘法,和N(N-1)次加法;像一個8x8階矩陣運算,如果使用普通的全矩陣乘法運算,需要84次乘法,N2(N2-1)次加法運算,顯然,對於實時的壓縮需要來說,這是一個極大的運算量,對硬件要求較高。