JPEG

圖片失真壓縮標準方法・檔案格式

JPEG或稱JPG,是一種針對相片影像而廣泛使用的失真壓縮標準方法,由聯合圖像專家小組(英語:Joint Photographic Experts Group)開發。此團隊創立於1986年,1992年發布了JPEG的標準而在1994年獲得了ISO 10918-1的認定。JPEG與視訊音訊壓縮標準的MPEGMoving Picture Experts Group)很容易混淆,但兩者是不同的組織及標準。

JPEG
由左至右,壓縮率越來越高的照片。
副檔名
.JPEG, .jpg, .jpe
.jfif, .jfi, .jif(容器)
網路媒體型式
image/JPEG
類型代碼英語Type codeJPEG
統一類型標識public.JPEG
開發者聯合圖像專家小組英語Joint Photographic Experts Group
首次發布1992年9月18日,​32年前​(1992-09-18
格式類型破壞性圖像格式
網站www.jpeg.org

JPEG本身只有描述如何將一個影像轉換為字節的數據串流(streaming),但並沒有說明這些位元組如何在任何特定的儲存媒體上受封存起來。JPEG的壓縮方式通常是有損壓縮,即在壓縮過程中圖像的品質會遭受到可見的破壞,有一種以JPEG為基礎的標準Lossless JPEG是採用無失真的壓縮方式,但Lossless JPEG並沒有受到廣泛的支援。

一個由C-Cube Microsystems等公司所建立的額外標準,稱為JFIFJPEG File Interchange FormatJPEG檔案交換格式,聯合圖像專家小組檔案交換格式)詳細說明如何從一個JPEG串流,產出一個適合於電腦儲存和傳輸(像是在網際網路上)的檔案。在普遍的用法,當有人稱呼一個"JPEG檔案",一般而言他是意指一個JFIF檔案,或有時候是一個Exif JPEG檔案。然而,也有其他以JPEG為基礎的檔案格式,像是JNG

使用JPEG格式壓縮的圖片檔案一般也稱為JPEG Files,最普遍使用的副檔名格式為.jpg,其他常用的副檔名還包括.JPEG.jpe.jfif以及.jifJPEG格式的資料也能受嵌進其他類型的檔案格式中,像是TIFF類型的檔案格式。

JPEG/JFIF全球資訊網上最普遍的用來儲存和傳輸照片的格式。它並適合於線條繪圖drawing)和其他文字或圖示iconic)的圖形,因為它的壓縮方法用在這些類型的圖形上,得到的結果並不好(PNGGIF通常是用來存儲這類的圖形;GIF每個像素只有8位元,並不很適合於存儲彩色照片,PNG可以無失真地儲存照片,但是檔案太大的缺點讓它不太適合在網路上傳輸)。

對於JFIFMIME媒體類型是image/JPEG(定義於RFC 1341)。

JPEG編/解碼器示例

編碼

JPEG標準中許多選項很少使用,大多數圖像軟件在創建JPEG文件時使用更簡單的JFIF格式。當應用到一個擁有每個像素24位元(24 bits per pixel,紅、藍、綠各有八位元)的輸入時,這邊只有針對更多普遍編碼方法之一的簡潔描述。這個特定的選擇是一種失真資料壓縮方法。

色彩空間轉換

首先,影像由RGB(紅綠藍)轉換為一種稱為YUV的不同色彩空間。這與模擬PAL制式彩色電視傳輸所使用的色彩空間相似,但是更類似於MAC電視傳輸系統運作的方式。但不是模擬NTSC,模擬NTSC使用的是YIQ色彩空間。

YUV分量可以由PAL制系統中歸一化(經過伽馬校正)的R',G',B'經過下面的計算得到:

  • Y=0.299R'+0.587G'+0.114B'
  • U=-0.147R'-0.289G'+0.436B'
  • V=0.615R'-0.515G'-0.100B'

這種編碼系統非常有用,因為人眼對亮度差異的敏感度高於色彩變化。在此前提下可以設計更加高效壓縮圖像的編碼器(encoder)。

縮減取樣(Downsampling)

經過RGB到YUV顏色空間的轉換後,開始進行縮減採樣來減少U和V的成份(稱為"縮減取樣"或"色度抽樣"(chroma subsampling)。在JPEG上這種縮減取樣的比例可以是4:4:4(無縮減取樣),4:2:2(在水平方向2的倍數中取一個),以及最普遍的4:2:0(在水平和垂直方向2的倍數中取一個)。對於壓縮過程的剩餘部份,Y、U、和V都是以非常類似的方式來個別地處理。

離散餘弦變換(Discrete cosine transform)

 
以8-位元灰階所顯示的8x8子影像

下一步,將影像中的每個成份(Y, U, V)生成三個區域,每一個區域再劃分成如瓷磚般排列的一個個的8×8子區域,每一子區域使用二維的離散餘弦變換(DCT)轉換到頻率空間。

如果有一個如這樣的8×8的8-位元(0~255)子區域:

 

接著推移128,使其範圍變為 -128~127,得到結果為

 

且接著使用離散餘弦變換,和捨位取最接近的整數,得到結果為

 

左上角之相當大的數值稱為DC係數(直流係數);其他63個值稱為AC係數(交流係數)。下面將對所有8×8表格中的DC係數使用差分編碼,對AC係數使用行程編碼[1]

量化(Quantization)

人類眼睛在一個相對大範圍區域,辨別亮度上細微差異是相當的好,但是在一個高頻率亮度變動之確切強度的分辨上,卻不是如此地好。這個事實讓我們能在高頻率成份上極佳地降低資訊的數量。簡單地把頻率領域上每個成份,除以一個對於該成份的常數就可完成,且接著捨位取最接近的整數。這是整個過程中的主要失真運算。以這個結果而言,經常會把很多更高頻率的成份捨位成為接近0,且剩下很多會變成小的正或負數。

一個普遍的量化矩陣是:

 

使用這個量化矩陣與前面所得到的DCT係數矩陣逐項相除,得到結果為:

 

舉個例子,使用−415(DC係數)且捨位得到最接近的整數

 

熵編碼技術(entropy coding)

 
Z字型掃描矩陣的順序

熵編碼是無失真資料壓縮的一個特別形式。它牽涉到將影像成份以Z字型(zigzag)排列,把相似頻率群組在一起(矩陣中往左上方向是越低頻率之係數,往右下較方向是較高頻率之係數),插入長度編碼的零,且接著對剩下的使用霍夫曼編碼。 JPEG標準也允許(但是並不要求)在數學上優於霍夫曼編碼的算術編碼之使用。然而,這個特色幾乎很少獲使用,因為它被專利所涵蓋,且它相較於霍夫曼編碼在編碼和解碼上會更慢。使用算術編碼一般會讓檔案更小約5%。

對於前者量化的係數所作的Z字型序列會是:

−26,
−3, 0,
−3, −2, −6,
2, −4, 1, −3,
1, 1, 5, 1, 2,
−1, 1, −1, 2, 0, 0,
0, 0, 0, −1, −1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0,
0, 0,
0

當剩下的所有係數都是零,對於過早結束的序列,JPEG有一個特別的霍夫曼編碼用詞。使用這個特殊的編碼用詞,EOB,該序列變為

−26,
−3, 0,
−3, −2, −6,
2, −4, 1 −3,
1, 1, 5, 1, 2,
−1, 1, −1, 2, 0, 0,
0, 0, 0, −1, −1, EOB

壓縮比率與不自然痕跡(artifact)

 
失真壓縮導致的人為現象(上)與原圖(下),200%放大

按:artifact在這個領域又解釋為贗像、非自然信號、人為現象。

在量化階段時,依照除數的不同,會使結果的壓縮比率可能有很多變化。10:1通常可得到無法使用肉眼分辨與原圖差異的影像。100:1壓縮通常是可行的,但與原圖相較,會看出明顯的不自然痕跡。壓縮的適當等級是依據要壓縮那一種影像而定。

使用全球資訊網的人,可能熟悉這種出現在JPEG數位影像,已知壓縮人為現象的不規則現象。這是由於JPEG演算法的量化步驟所造成的結果。這種現象在臉部照片中的眼睛四周特別明顯。他們可以藉由選擇壓縮的較低水平(使用較低的壓縮率)來減少這種現象;他們可能藉由使用無失真檔案格式來儲存一個影像來消除這種現象,然而針對照片影像,這樣通常會使檔案大小增加。

解碼

解碼來顯示影像,包含反向作以上所有的過程

取DCT係數矩陣(在把DC係數差異加回去之後)

 

且以前面的量化矩陣乘以它,得到

 

左上角的部份與原本DCT係數矩陣非常接近地相似。使用反向DCT得到一個有數值的影像(仍然受移位128)

注意原來(上)與解壓縮影像(下)的些微差異,在角落處可以輕易地看出來
 

且對每一個項目加上128

 

這是解壓縮的子影像,且可以用來與原本子影像相比(也可以看右方的影像),藉由取兩者之間的差異(原本—解壓縮)得到誤差值。

 

每個像素大約是5的平均絕對誤差,也就是說, 。誤差在左下角顯而易見,左下方的像素變得比它鄰近右方的像素還更暗。

用法

JPEG在色調及顏色平滑變化的相片或是寫實繪畫(painting)上可以達到它最佳的效果。在這種情況下,它通常比完全無失真方法作得更好,仍然可以產生非常好看的影像(事實上它會比其他一般的方法像是GIF產生更高品質的影像,因為GIF對於線條繪畫(drawing)和圖示的圖形是無失真,但針對全彩影像則需要極困難的量化)。

照片

JPEG壓縮的不自然現象可以很好地調和到細微非均勻材質的相片中,因此允許得到更高的壓縮率。

低品質(10%),檔案大小為1.7 KB。
中等品質(50%),檔案大小為5.7 KB。
最高品質(100%),檔案大小為36 KB。

附註:以上的影像並不是IEEE/CCIR/EBU測試影像,且壓縮編碼器的設定並沒有指明或是可以得到。

中等品質的相片只有六分之一的儲存空間,但是幾乎沒有明顯的細節損失或是看得到的人為效果。然而,一旦超過一個某整的壓縮限度,壓縮的影像逐漸地顯現出可以看得到的瑕疵。參考比率失真理論rate distortion theory)的文章有針對這種限度效果的數學上之解釋。

醫學影像:少見的JPEG 12位元支援模式

有很多醫學的影像系統可以建立和處理12位元JPEG影像。12位元JPEG格式已經是JPEG規格的一部份,但是非常少商業軟件程序(或網頁瀏覽器)支援這種不常使用的JPEG格式。

其他失真壓縮的編碼格式

更新的失真方法,尤其是小波壓縮(wavelet compression),在這些情況下甚至能作得更好。然而,JPEG是一種建立得相當好的標準,擁有很多可使用的軟體,包含自由軟體,因此到2005年它持續獲大量使用。很多小波演算法受到專利保護,要在很多軟體專案中自由地使用他們是困難或是不可能的。

JPEG委員會現在也已經建立其自有的小波基礎標準-JPEG 2000,希望最終能取代原來的JPEG標準。

潛在的專利爭議

在2002年Forgent Networks主張他擁有且將會履行在JPEG技術上的專利權,起因於一個在1986年已經歸檔的專利(美國專利第4,698,672號)。這個公告已經引起一陣大騷動,令人想起Unisys試圖主張對於GIF影像壓縮標準的權利。

JPEG委員會審慎調查這個在2002年所主張的專利,且發現他們因為前案而無效作廢[2]。其他的也已推斷Forgent並無擁有涵蓋JPEG的專利[3]。儘管如此,在2002年和2004年之間,Forgent藉由把他們的專利授權給某些30家公司,而獲得大約9千萬美元。在2004年4月,Forgent控告31家其他公司來強求更多的授權支付。同年的七月,21家較大的電腦公司組成的協會提出反控告,包含使該專利無效的目標。然而,到2005年7月的時候,這場官司仍然持續中。

JPEG委員會在他的明確目標中有一項,是他們的標準在不支付授權金之下是可以受實作的,且他們已從超過20個大型組織中,得到適當的授權權利給他們即將到來的JPEG 2000標準。

專利案結束

經過數年的糾纏,於2006年11月,JPEG專利持有者Forgent Networks終於與30家PC廠商結束了侵權官司,代價是PC廠商向Forgent賠款800萬美元,而不是Forgent期望的1億美元。

在與PC廠商大打官司之前,Forgent已經與60多家公司和解,獲得的專利費用總額高達1.1億美元。包括雅虎在內的45家PC廠商拒絕就4698672號專利問題和解,而是選擇了對簿公堂,不過其中15家在此之前已經與Forgent和解。

雖然還是賠了款,但PC廠商們並沒有輸掉官司;雖然沒能得到自己想要的大筆美金,Forgent也沒有徹底失敗。在非盈利性組織美國公共專利基金會(PPF)的協助下,他們設法獲得了美國專利和商標局(USPTO)的認可,對Forgent專利的有效性在2月和6月兩次重新進行了鑑定,最終法庭限制了Forgent專利的應用範圍。而從另一方面看,Forgent的專利也得到了一定的維護,這要比被徹底推翻好得多,Forgent也表示對結果感到很滿意。

Forgent CEO Richard Snyder稱:「在'672專利的有效期內,我們已經獲得了1.1億多美元。很快,Forgent還會再次有所行動。我們的精力現在已經轉移到'746專利上,並等待2007年5月的陪審團裁決,同時我們還會繼續促進(分公司)NetSimplicity的軟件業務。」[4]

無損耗旋轉(lossless JPEG rotation)

雖然任何對JPEG圖像的處理都有可能導致因為解壓後再壓縮而引起的損耗,然而,對於簡單的旋轉動作,數學上是可以有辦法使圖像得以旋轉而無損圖像本身的資料。也就是說,有一種方法可以在無需把圖像解壓後才可以旋轉。這是因為JPEG的檔案格式本身是以一個個模塊為單位來壓縮,所以,只需要把模塊重排,再對每個模塊旋轉,就可以達至無損耗的旋轉。

使用者在操作上加以注意。例如:在Adobe Photoshop裡,用戶若要作無損耗旋轉前,必須在載入圖像之後立刻用「Save As...」功能儲存一個備份。然後當圖像旋轉過後,由於Photoshop已掌握了圖像的基本資料,所以在儲存時得以使用原來的設定。若沒有作事先儲存,Photoshop就會把旋轉後的圖像重新計算各項參數,並重新對圖像進行壓縮處理。這樣就會造成資料的損耗。

壓縮標準

JPEG是由國際標準組織(ISO)國際電話電報諮詢委員會(CCITT)為靜態圖像所建立的第一個國際數字圖像壓縮標準,也是至今一直在使用的、應用最廣的圖像壓縮標準。JPEG由於可以提供有損壓縮,因此壓縮比可以達到其他傳統壓縮算法無法比擬的程度。

JPEG的壓縮模式有以下幾種:

  •  順序式編碼(Sequential Encoding)
 一次將圖像由左到右、由上到下順序處理。
  •  遞增式編碼(Progressive Encoding)
 當圖像傳輸的時間較長時,可將圖像分數次處理,以從模糊到清晰的方式來傳送圖像(效果類似GIF在網絡上的傳輸)。
  •  無失真編碼(Lossless Encoding)
  •  階梯式編碼(Hierarchical Encoding)
 圖像以數種分辨率來壓縮,其目的是為了讓具有高分辨率的圖像也可以在較低分辨率的設備上顯示。

在Independent JPEG Group所提供的源碼上,有jpegtran程式,就提供了優化Huffman,轉成漸進式,鏡射,旋轉這些無損耗轉換。

參看:無損耗JPEG旋轉程式列表頁面存檔備份,存於網際網路檔案館)(英語)

參見

參考來源

  1. ^ 呂鳳軍. 数字图像处理编程入门. 清華大學出版社. 1999. 
  2. ^ 存档副本. [2011-05-29]. (原始內容存檔於2007-07-14). 
  3. ^ 存档副本. [2004-08-17]. (原始內容存檔於2004-08-17). 
  4. ^ JPEG: PC厂商向JPEG专利持有者赔偿800万美元_第三媒体频道. [2013-07-21]. (原始內容存檔於2014-01-08). 

外部連結