姓名:李偉? ? ? 學號:17101223393
【嵌牛導讀】:大家對JPEG了解嗎?今天和大家分享一下。
【嵌牛鼻子】:DCT 變換、圖像壓縮。
【嵌牛提問】:JPEG變換的計算過程
【嵌牛正文】:
JPEG 是Joint Photographic Experts Group(聯合圖像專家小組)的縮寫,是第一個國際圖像壓縮標準。JPEG圖像壓縮算法能夠在提供良好的壓縮性能的同時,具有比較好的重建質量,被廣泛應用于圖像、視頻處理領域。人們日常碰到的“.jpeg”、‘’.jpg“等指代的是圖像數據經壓縮編碼后在媒體上的封存形式,不能與JPEG壓縮標準混為一談。
JPEG編解碼器
下圖為JPEG基本系統的編解碼器原理圖,輸入的彩色圖像為Y、U、V三個分量,JPEG對它們分別進行編碼。
壓縮步驟
由于JPEG的有損壓縮方式(Lossy mode of operation)并不比其他的壓縮方法更優秀,
因此我們著重來看它的有損壓縮中最常用的基線JPEG算法(baseline sequential)。以一幅24位彩色圖像為例,JPEG的壓縮步驟分為:
1.顏色轉換
JPEG支持圖像采用任何一個色彩空間,支持1~4個顏色分量。灰度圖像顏色分量數為1。RGB、YUV、YCbCr等擁有3種顏色分量。4種顏色分量的例子是青、洋紅、黃和黑(Cyan,Magenta,Yellow,and Black,CMYK)。為了減少色度通道包含的大量的冗余信息,本例中采用YCbCr色彩空間。首先需要進行從RGB到YCbCr的色彩空間變換:
Y = 0.299000R + 0.587000G + 0.114000B
Cb = -0.168736R - 0.331264G + 0.500002B
Cr = 0.500000R - 0.418688G - 0.081312B
其中,Y表示亮度分量,Cb和Cr表示藍紅色度分量。
2.DC電平偏移
最初,在圖像中的像素存儲在無符號的整數中。對于數學計算,在圖像中任何變換或數學計算開始之前,根本上是將這些采樣轉換成兩個補碼表示。DC電平偏移的目的是保證輸入圖像的采樣有近似地集中在零附近的動態范圍。DC電平偏移執行的圖像采樣只通過無符號數表示。
方法:假設圖片分量的采樣精度為n,那么分量中的每個像素值應減去2的(n-1)次冪。
對于圖像而言他的采樣由無符號的整數表示,例如CT(X光斷層成像)圖像,動態范圍已經集中于零附近,所以不需要DC電平偏移。
3.子采樣
色彩空間轉換之后,圖像的大多數空間信息包含在亮度分量Y中。色度分量Cb和Cr包含大量冗余的顏色信息,所以我們運用子采樣較少色度數據量以在丟失少量信息的情況下壓縮圖像。
基線JPEG常用的子采樣格式為4:2:0,同時支持4:2:2和4:4:4顏色格式。
4.DCT變換
DCT(DiscreteCosineTransform)是將圖像信號在頻率域上進行變換,分離出高頻和低頻信息的處理過程。然后再對圖像的高頻部分(即圖像細節)進行壓縮,以達到壓縮圖像數據的目的。首先將圖像劃分為多個8*8的矩陣。然后對每一個矩陣作DCT變換。變換后得到一個頻率系數矩陣,其中的頻率系數都是浮點數。
標準色度量化表
標準亮度量化表
5.量化
由于在后面編碼過程中使用的碼本都是整數,因此需要對變換后的頻率系數進行量化,將之轉換為整數。由于進行數據量化后,矩陣中的數據都是近似值,和原始圖像矩陣之間有了差異,這一差異是造成圖像失真后失真的主要原因。
量化算法
在這一過程中,質量因子的選取至為重要。值選得過大,可以大幅度提高壓縮比,但是圖像質量就比較差;反之,質量因子越小(最小為1),圖像重建質量越好,但是壓縮比越低。對此,ISO已經制定了一組供JPEG代碼實現者使用的標準量化值(如右圖所示)。
右圖的兩個量化表的設計是根據由Lohscheller做的心理視覺實驗來確定二維基函數的可見閾值。
這些表也不適用于各種各樣的圖像,但他們為大多8位精度自然圖像進行亮度和色度采樣提供了合理的、出色的結果。
6.編碼
從前面過程我們可以看到,顏色轉換完成到編碼之前,圖像并沒有得到進一步的壓縮,DCT變換和量化可以說是為編碼階段做準備。
編碼采用兩種機制:一是0值的行程長度編碼;二是熵編碼(EntropyCoding)。
zig_zag
①之字形排序(Zig-zag ordering)
在JPEG中,采用曲徊序列,即以矩陣對角線的法線方向作“之”字排列矩陣中的元素。這樣做的優點是使得靠近矩陣左上角、值比較大的元素排列在行程的前面,而行程的后面所排列的矩陣元素基本上為0值。
②使用RLE對交流系數(AC)進行編碼
行程長度編碼是非常簡單和常用的編碼方式,在此不再贅述。
需要注意的是,AC系數的之字形序列編碼中有兩個特殊符號——(0,0)和(15,0)。第一個特殊符號指的是塊的結束(end-of-block,EOB),用來表明在之字形塊中剩余的元素都是零。另一個特殊符號是指零游程長度(zero-run-length,ZRL),用來表明16個零游程。基線JPEG允許的零游程最大長度是16個。如果這里的零超過16個,那么這個游程分成幾個長度為16的零游程。
③使用DPCM對直流系數(DC)進行編碼
DCT系數量化之后,通過差分編碼對量化后的DC系數編碼。當前塊的DC系數減去前個塊的DC系數,然后對其差值進行編碼,如右圖所示。這就利用了鄰接塊DC值之間的空間相關性。
④熵編碼
編碼實際上是一種基于統計特性的編碼方法。在JPEG中允許采用HUFFMAN編碼或者算數編碼。而基線JPEG算法(baseline sequential)采用的是前者。
經過RLE編碼的AC系數可以映射成兩個標志(RUNLENGTH,CATEGORY)和(AMPLITUDE),前者采用的是霍夫曼編碼,而后者采用的是VLI編碼。同理經過DPCM編碼的DC系數同樣可以映射成兩個標志(CATEGORY)和(AMPLITUDE),,前者采用霍夫曼編碼,后者采用VLI編碼。
基線JPEG允許使用4個霍夫曼表,兩個用于AC系數編碼,兩個用于DC系數編碼。具體的編碼表請查詢ITU-T.81的表K.3~K.6
數據壓縮格式
1.JPEG定義了三種壓縮數據格式:
a) 交換格式 (interchange format)
b) 壓縮圖像數據的縮略格式(abbreviated format for compressed image data,)
c) 規范表數據的縮略格式(abbreviated format for table-specification data)
2.壓縮數據規范的基本內容(General aspects of the compressed data formatspecifications)
在結構上,壓縮數據格式包含一個由參數、標志和熵編碼數據段組成的有序集合。參數和標記往往又形成標志段。由于所有這些組成部分是由字節對齊的代碼表示的,因此每一個壓縮數據格式由一個8-bits字節的有序序列組成。對于每一個字節,都定義了一個最高有效位(MSB)和一個最低有效位(LSB)。[4]
插圖的語法規定示例
3.插圖的語法規定(Conventions for syntax figures)
如右圖:
為了便于了解JPEG壓縮數據流中每一個frame和scan的內容,必須掌握以下語法
– 參數/標記指示符:一個細線框包含一個標志或一個單獨的參數;
– 段指示符:一個粗線框包含一個標志段、一個熵編碼段或他們的結合;
– 參數長度指示符:細線框的寬度與其包含的參數或標志的位長成正比(如圖B.1中的E(4位),B(8位)和D(16位)所示)。相反,粗線框的寬度是無意義的;
– 可選的/有條件的指示符:方括號標明,在壓縮數據中,當前標志段或標記只是可選的或有條件的。
– 次序:交換格式中,圖中所示的參數或標志都先于其右邊所示的參數或標志,并跟在它左邊的參數后面。
– 熵編碼數據指示符:尖括號標明,其包圍的內容是已經經過了熵編碼的。