淺談圖像壓縮演算法
余科亮
本文僅討論靜止圖像的壓縮基本演算法,圖像壓縮的目的在於以較少的數據來
表示圖像以節約存儲費用,或者傳輸時間和費用。
JPEG壓縮演算法可以用失真的壓縮方式來處理圖像,但失真的程度卻是肉眼所
無法辯認的。這也就是為什麼JPEG會有如此滿意的壓縮比例的原因。
下面主要討論,JPEG基本壓縮法。
一.JPEG壓縮過程
JPEG壓縮分四個步驟實現:
1.顏色模式轉換及采樣;
2.DCT變換;
3.量化;
4.編碼。
二.1.顏色模式轉換及采樣
RGB色彩系統是我們最常用的表示顏色的方式。JPEG採用的是YCbCr色彩系統。
想要用JPEG基本壓縮法處理全彩色圖像,得先把RGB顏色模式圖像數據,轉換為
YCbCr顏色模式的數據。Y代表亮度,Cb和Cr則代表色度、飽和度。通過下列計算
公式可完成數據轉換。
Y=0.2990R+0.5870G+0.1140B
Cb=-0.1687R-0.3313G+0.5000B+128
Cr=0.5000R-0.4187G-0.0813B+128
人類的眼晴對低頻的數據比對高頻的數據具有更高的敏感度,事實上,人類
的眼睛對亮度的改變也比對色彩的改變要敏感得多,也就是說Y成份的數據是比較
重要的。既然Cb成份和Cr成份的數據比較相對不重要,就可以只取部分數據來處
理。以增加壓縮的比例。JPEG通常有兩種采樣方式:YUV411和YUV422,它們所代
表的意義是Y、Cb和Cr三個成份的數據取樣比例。
2.DCT變換
DCT變換的全稱是離散餘弦變換(Discrete Cosine Transform),是指將一組
光強數據轉換成頻率數據,以便得知強度變化的情形。若對高頻的數據做些修飾,
再轉回原來形式的數據時,顯然與原始數據有些差異,但是人類的眼睛卻是不容
易辨認出來。
壓縮時,將原始圖像數據分成8*8數據單元矩陣,例如亮度值的第一個矩陣內
容如下:
JPEG將整個亮度矩陣與色度Cb矩陣,飽和度Cr矩陣,視為一個基本單元稱作
MCU。每個MCU所包含的矩陣數量不得超過10個。例如,行和列采樣的比例皆為4:
2:2,則每個MCU將包含四個亮度矩陣,一個色度矩陣及一個飽和度矩陣。
當圖像數據分成一個8*8矩陣後,還必須將每個數值減去128,然後一一代入
DCT變換公式中,即可達到DCT變換的目的。圖像數據值必須減去128,是因為DCT
轉換公式所接受的數字范圍是在-128到+127之間。
DCT變換公式:
x,y代表圖像數據矩陣內某個數值的坐標位置
f(x,y)代表圖像數據矩陣內的數個數值
u,v代表DCT變換後矩陣內某個數值的坐標位置
F(u,v)代表DCT變換後矩陣內的某個數值
u=0 且 v=0 c(u)c(v)=1/1.414
u>0 或 v>0 c(u)c(v)=1
經過DCT變換後的矩陣數據自然數為頻率系數,這些系數以F(0,0)的值最
大,稱為DC,其餘的63個頻率系數則多半是一些接近於0的正負浮點數,一概稱
之為AC。
3、量化
圖像數據轉換為頻率系數後,還得接受一項量化程序,才能進入編碼階段。
量化階段需要兩個8*8矩陣數據,一個是專門處理亮度的頻率系數,另一個則是
針對色度的頻率系數,將頻率系數除以量化矩陣的值,取得與商數最近的整數,
即完成量化。
當頻率系數經過量化後,將頻率系數由浮點數轉變為整數,這才便於執行最
後的編碼。不過,經過量化階段後,所有數據只保留整數近似值,也就再度損失
了一些數據內容,JPEG提供的量化表如下:
4、編碼
Huffman編碼無專利權問題,成為JPEG最常用的編碼方式,Huffman編碼通常
是以完整的MCU來進行的。
編碼時,每個矩陣數據的DC值與63個AC值,將分別使用不同的Huffman編碼
表,而亮度與色度也需要不同的Huffman編碼表,所以一共需要四個編碼表,才
能順利地完成JPEG編碼工作。
DC編碼
DC是彩採用差值脈沖編碼調制的差值編碼法,也就是在同一個圖像分量中取
得每個DC值與前一個DC值的差值來編碼。DC採用差值脈沖編碼的主要原因是由於
在連續色調的圖像中,其差值多半比原值小,對差值進行編碼所需的位數,會比
對原值進行編碼所需的位數少許多。例如差值為5,它的二進製表示值為101,如
果差值為-5,則先改為正整數5,再將其二進制轉換成1的補數即可。所謂1的補
數,就是將每個Bit若值為0,便改成1;Bit為1,則變成0。差值5應保留的位數
為3,下表即列出差值所應保留的Bit數與差值內容的對照。
在差值前端另外加入一些差值的霍夫曼碼值,例如亮度差值為5(101)的位
數為3,則霍夫曼碼值應該是100,兩者連接在一起即為100101。下列兩份表格分
別是亮度和色度DC差值的編碼表。根據這兩份表格內容,即可為DC差值加上霍夫
曼碼值,完成DC的編碼工作。
AC編碼
AC編碼方式與DC略有不同,在AC編碼之前,首先得將63個AC值按Zig-zag排
序,即按照下圖箭頭所指示的順序串聯起來。
63個AC值排列好的,將AC系數轉換成中間符號,中間符號表示為RRRR/SSSS,
RRRR是指第非零的AC之前,其值為0的AC個數,SSSS是指AC值所需的位數,AC系
數的范圍與SSSS的對應關系與DC差值Bits數與差值內容對照表相似。
如果連續為0的AC個數大於15,則用15/0來表示連續的16個0,15/0稱為ZRL
(Zero Rum Length),而(0/0)稱為EOB(Enel of Block)用來表示其後所
剩餘的AC系數皆等於0,以中間符號值作為索引值,從相應的AC編碼表中找出適
當的霍夫曼碼值,再與AC值相連即可。
例如某一組亮度的中間符為5/3,AC值為4,首先以5/3為索引值,從亮度AC
的Huffman編碼表中找到1111111110011110霍夫曼碼值,於是加上原來100(4)
即是用來取[5,4]的Huffman編碼1111111110011110100,[5,4]表示AC值為4的
前面有5個零。
由於亮度AC,色度AC霍夫曼編碼表比較長,在此省略去,有興趣者可參閱相
關書籍。
實現上述四個步驟,即完成一幅圖像的JPEG壓縮。
參考資料
[1] 林福宗 《圖像文件格式(上)——Windows 編程》,清華大學出版社,
1996年
[2] 李振輝、李仁各編著,《探索圖像文件的奧秘》,清華大學出版社,1996年
[3] 黎洪松、成實譯《JPEG靜止數據壓縮標准》,學苑出版社,1996年
⑵ 現有的圖像壓縮演算法都有那幾種
靜態圖像壓縮最常用的是jpeg, 先進點的是jpeg2000。研究這兩個就足夠了。
動態視頻的演算法就太多了,VCD用mpeg-1, DVD用mpeg-2, 視頻會議常用H.261。壓縮比更高一些的是H.263和mpeg-4,最新一代的演算法是H.264和微軟的WMV9,用於新一代HD-DVD及藍光光碟上。
⑶ 數據壓縮的流行演算法
Lempel-Ziv(LZ)壓縮方法是最流行的無損存儲演算法之一。DEFLATE是 LZ 的一個變體,它針對解壓速度與壓縮率進行了優化,雖然它的壓縮速度可能非常緩慢,PKZIP、gzip 以及 PNG 都在使用 DEFLATE。LZW (Lempel-Ziv-Welch)是 Unisys 的專利,直到2003年6月專利到期限,這種方法用於 GIF 圖像。另外值得一提的是 LZR (LZ-Renau) 方法,它是 Zip 方法的基礎。LZ 方法使用基於表格的壓縮模型,其中表格中的條目用重復的數據串替換。對於大多數的 LZ 方法來說,這個表格是從最初的輸入數據動態生成的。這個表格經常採用霍夫曼編碼維護(例如,SHRI、LZX)。 一個性能良好基於 LZ 的編碼機制是 LZX,它用於微軟公司的 CAB 格式。
⑷ 常用的數據壓縮演算法有哪些
基本的分為兩大類:有損和無損。
有損壓縮:主要是一些量化演算法,比如a率,u率,lloyds最優量化。
無損壓縮:主要是一些編碼演算法,比如子帶編碼,差分編碼,哈夫曼編碼等。
另外時頻變換雖然沒壓縮效果,但是是很好的壓縮工具,比如fft,dct等。
最後就是壓縮感知稀疏重建等。
⑸ RAR和ZIP兩種格式的壓縮演算法分別是什麼
RAR文件的擴展名是.rar(不區分大小寫,),MIME類型是application/x-rar-compressed。同樣是無損數據壓縮,RAR文件通常比ZIP文件壓縮比要高,但是壓縮速度較慢。因為RAR文件頭也要佔據一定空間,在數據壓縮餘地不大時,壓縮過的文件可能比原文件要大。RAR的一個主要優點是可以把文件壓縮目標分割到多個文件,並且很容易從這樣的分割的壓縮文件解壓出源文件。另外,RAR也支持緊縮格式,把所有文件壓縮到同一個數據區以加大壓縮比,代價是解壓一個單獨的文件時必須解壓其前面的所有文件。新的RAR的加密演算法使用的是AES,而舊的RAR的加密演算法是私有的。這兩種演算法都很難破解,所以在沒有密碼的情況下只能用字典暴力破解法來破解。RAR中也可以加入冗餘的修復信息,在文件損壞但是修復信息足夠完好時可以對壓縮包進行修復。
⑹ 壓縮的演算法都有哪些
只有最常見的zip的,估計你都要研究上n久了。。。
文本文件一般有zip,rar,
網頁文件有htz
視頻文件有rm,avi
語音文件有mp3,
圖片文件有png,gif,jpg
這些都是文件壓縮的。。。。
------------------------------------
ZIP文件的總體格式
分文件頭信息+文件壓縮數據
中心目錄+中心目錄記錄結束符
1.分文件頭信息:
位元組數 描述
4 分文件頭信息標志(0x04034b50)
2 解壓縮所需版本
2 通用比特標志位(置比特0位=加密;置比特1位=使用壓
縮方式6,並使用8k變化目錄,否則使用4k變化目錄;置比特2位=使用壓
縮方式6,並使用3個ShannonFano樹對變化目錄輸出編碼,否則使用2個
ShannonFano樹對變化目錄輸出編碼,其它比特位未用)
2 壓縮方式(0=不壓縮,1=縮小,2=以壓縮因素1縮小,3=以
壓縮因素2縮小,4=以壓縮因素3縮小,5=以壓縮因素4縮小,6=自展)
2 文件最後修改時間
2 文件最後修改日期
4 32位校驗碼
4 壓縮文件大小
4 未壓縮文件大小
2 文件名長
2 擴展段長
? 文件名(不定長)
? 擴展段(不定長)
2.中心目錄結構
文件頭信息...中心目錄記錄結束符
文件頭:
位元組數 描述
4 中心文件頭信息標志(0x02014b50)
2 主機操作系統(高位位元組表示主機操作系統,低位字
節表示ZIP壓縮軟體版本號,其值除以10表示主版本號,其值模10表示
次版本號。0=MS-DOS,OS/2 FAT文件系統,1=Ami ga,2=VMS,3=Unix及
變種,4=VM/CMS,5=AtariST,6=OS/2 HPFS,7=Macintosh,8=Z-System,9
=C P/M,10-255未用)
2 解壓縮所需版本
2 通用比特標志
2 壓縮方式
2 文件最後修改時間(用標準的MS-DOS時間日 期格式
編碼)
2 文件最後修改日期
4 32位校驗碼(使用David Schwaderer的CRC-32演算法產
生)
4 壓縮文件大小
4 未壓縮文件大小
2 文件名長
2 擴展段長
2 文件注釋長(分別為文件名長,擴展段,注釋 段,小於
64K)
2 磁碟起始號(本文件在磁碟中的起始號)
2 內部文件屬性(最低位若置1,表示為ASC文本,否則為
二進制數據,其它位未用)
4 外部文件屬性(依賴於主機操作系統)
4 分文件頭相對位移
? 文件名(不定長)
? 擴展段(不定長,用於未來擴展,低版本為0長)
? 文件注釋(不定長)
3.中心目錄記錄結束符
位元組數 描述
4 中心目錄標記結束符(0x06054b50)
2 磁碟號(其中包括中心目錄結束記錄)
2 磁碟中心目錄起始號
2 磁碟中心目錄入口總數
2 中心目錄入口總數(ZIP文件中的文件總數)
2 整個中心目錄大小
4 關於起始磁碟號的中心目錄初始偏移
2 ZIP文件注釋長度
? ZIP文件注釋(不定長)
加密方法
PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解壓
縮前必須先解密。每個加密文件具有一個12位元組的加密文件頭擴展信
息,存儲於數據區的起始位置,加密前先設置一個起始值,然後被三個3
2位的密鑰加密。密鑰被使用者提供的口令初始化。12個位元組加密之
後,由PKZIP的偽隨機數產生方法,結合PKZIP中使用CRC-32演算法對密鑰
進行更新。
具體實施分為三步:
1.用口令對三個32位密鑰初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循環 for i=0 to length(password)-1
調用更新密鑰函數 update_keys(password(i))
結束循環(循環口令長度次)
其中更新密鑰函數為:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函數中,給定一個4位元組的CRC值和一個字元,返回一個由CRC
-32演算法更新的CRC。具體為:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c>>8),crc32tab[256]的值
為固定的256個4位元組數。
2.讀取並加密12位元組的加密頭,再次對密鑰進行初始化。
將12個位元組的加密頭讀入緩沖區buffer(0)至buffer(11),循環fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
結束循環(循環12次)
其中的decrypt_byte()函數為:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))>>8)&0xff
end decrypt_byte
該步結束後,緩沖區中最後的二個位元組buffer(10)和buffer(11)
將成為加密文件校驗碼的二個最高位(按低至高順序存放)。對ZIP加
密文件進行解壓縮前,PKUNZIP軟體將使用者提供的口令按上述二個步
驟進行處理,得到的結果與校驗碼的二個高位位元組進行比較,只有當提
供了正確的口令時,結果一致,才能進行後續的解壓縮過程,否則,PKZI
P報告錯誤信息,程序自動結束。
3.讀取壓縮的數據流並以加密密鑰對其進行加密。
壓縮數據流按下述過程加密:
循環 直至數據流結束
C=數據流的一個位元組
temp=C^decrypt_byte()
update_keys(temp)
輸出temp
結束循環
⑺ 壓縮演算法原理
哈夫曼
哈夫曼編碼是無損壓縮當中最好的方法。它使用預先二進制描述來替換每個符號,長度由特殊符號出現的頻率決定。常見的符號需要很少的位來表示,而不常見的符號需要很多為來表示。
哈夫曼演算法在改變任何符號二進制編碼引起少量密集表現方面是最佳的。然而,它並不處理符號的順序和重復或序號的序列。
2.1 原理
我不打算探究哈夫曼編碼的所有實際的細節,但基本的原理是為每個符號找到新的二進製表示,從而通常符號使用很少的位,不常見的符號使用較多的位。
簡短的說,這個問題的解決方案是為了查找每個符號的通用程度,我們建立一個未壓縮數據的柱狀圖;通過遞歸拆分這個柱狀圖為兩部分來創建一個二叉樹,每個遞歸的一半應該和另一半具有同樣的權(權是 ∑ N K =1 符號數 k , N 是分之中符號的數量,符號數 k 是符號 k出現的次數 )
這棵樹有兩個目的:
1. 編碼器使用這棵樹來找到每個符號最優的表示方法
2. 解碼器使用這棵樹唯一的標識在壓縮流中每個編碼的開始和結束,其通過在讀壓縮數據位的時候自頂向底的遍歷樹,選擇基於數據流中的每個獨立位的分支,一旦一個到達葉子節點,解碼器知道一個完整的編碼已經讀出來了。
壓縮後的數據流是 24 位(三個位元組),原來是 80 位( 10 個位元組)。當然,我應該存儲哈夫曼樹,這樣解碼器就能夠解碼出對應的壓縮流了,這就使得該例子中的真正數據流比輸入的流數據量大。這是相對較短的數據上的副作用。對於大數據量來說,上面的哈夫曼樹就不佔太多比例了。
解碼的時候,從上到下遍歷樹,為壓縮的流選擇從左 / 右分支,每次碰到一個葉子節點的時候,就可以將對應的位元組寫到解壓輸出流中,然後再從根開始遍歷。
2.2 實現
哈夫曼編碼器可以在基本壓縮庫中找到,其是非常直接的實現。
這個實現的基本缺陷是:
1. 慢位流實現
2. 相當慢的解碼(比編碼慢)
3. 最大的樹深度是 32 (編碼器在任何超過 32 位大小的時候退出)。如果我不是搞錯的話,這是不可能的,除非輸出的數據大於 2 32位元組。
另一方面,這個實現有幾個優點:
1. 哈夫曼樹以一個緊密的形式每個符號要求 12 位(對於 8 位的符號)的方式存儲,這意味著最大的頭為 384 。
2. 編碼相當容易理解
哈夫曼編碼在數據有噪音的情況(不是有規律的,例如 RLE )下非常好,這中情況下大多數基於字典方式的編碼器都有問題。
⑻ 常見的壓縮技術有哪兩種它們的主要特點是什麼
數據壓縮可分成兩種類型,一種叫做無損壓縮,另一種叫做有損壓縮。
無損壓縮是指使用壓縮後的數據進行重構(或者叫做還原,解壓縮),重構後的數據與原來的數據完全相同;無損壓縮用於要求重構的信號與原始信號完全一致的場合。一個很常見的例子是磁碟文件的壓縮。根據目前的技術水平,無損壓縮演算法一般可以把普通文件的數據壓縮到原來的1/2~1/4。一些常用的無損壓縮演算法有霍夫曼(Huffman)演算法和LZW(Lenpel-Ziv & Welch)壓縮演算法。
有損壓縮是指使用壓縮後的數據進行重構,重構後的數據與原來的數據有所不同,但不影響人對原始資料表達的信息造成誤解。有損壓縮適用於重構信號不一定非要和原始信號完全相同的場合。例如,圖像和聲音的壓縮就可以採用有損壓縮,因為其中包含的數據往往多於我們的視覺系統和聽覺系統所能接收的信息,丟掉一些數據而不至於對聲音或者圖像所表達的意思產生誤解,但可大大提高壓縮比。