rle行程長度編碼概述
目前, 壓縮技術已經廣泛應用於各種軟體、聲音、影像格式等領域。總的來說, 有兩種截然不同的影象格式壓縮型別: 有失真壓縮和無失真壓縮[1]。有失真壓縮利用視覺識別的原理可以大大地壓縮檔案的資料, 但是會影響影象質量。無失真壓縮的基本原理是相同的顏色資訊只需儲存一次, 可以刪除一些重複資料, 大大減少要在磁碟上儲存的影象的容量。無失真壓縮方法的優點是能夠比較好地儲存影象的質量, 但是相對有失真壓縮來說這種方法的壓縮率是比較低的。常用的無失真壓縮演算法有 rle、lzw 等。
1 rle 壓縮演算法的基本原理
rle(run- length encoding 行程長度編碼)壓縮演算法是windows 系統中使用的一種影象檔案壓縮方法, 其基本思想是: 將一掃瞄行中顏色值相同的相鄰畫素用兩個位元組來表示, 第乙個位元組是乙個計數值, 用於指定畫素重複的次數; 第二個位元組是具體畫素的值[2]。主要通過壓縮除掉資料中的冗餘位元組或位元組中的冗餘位,從而達到減少檔案所佔空間的目的。例如, 有一表示顏色畫素值的字串rrrrrggbbbbbb,用 rle 壓縮方法壓縮後可用 5r2g6b 來代替,顯然後者的串長度比前者的串長度小得多。解碼時按照與編碼時採用的相同規則進行, 還原後得到的資料與壓縮前的資料完全相同。因此, rle 是無失真壓縮技術。
2 rle 壓縮演算法的改進
rle 壓縮演算法對於資料重複量大的情況是非常高效率的。但是, 當影象畫素的顏色值出現每個相鄰畫素的顏色值均不同的特殊情況時, 如顏色字串gbr, 則經此方法壓縮後變成了 1g1b1r, 反而會使資料串的長度增加一倍, 這是一種「病態」情況。為了盡量避免「病態」情況的出現, 需要對 rle 的基本方法進行改進。改進的方法是在具體實施時對計數位元組和影象畫素位元組進行了區分, 利用計數位元組的高兩位作為壓縮的標誌。對每個相鄰畫素的顏色值均不同的單個畫素資料, 只有當計數位元組高 2位全1( 即 c0) 時才加 1 計數, 否則直接輸出該畫素值, 因此避免了壓縮後長度增加一倍的情況。這樣就使得計數位元組本身的高 2 位也是全 1, 即計數位元組為 c0h+n( 畫素資料連續相同的位元組數)。當單個影象資料的值大於或等於c0 時, 則先輸出 c1, 再輸出該影象資料值, 否則直接輸出該資料。如有以下一系列資料: d2,20,30,30,30,c0,c1,c1,e2,e2,e2,…,e2(132個),e0,e0,d4,經壓縮後數 據 為 : c1,d2,20,c3,30,c1,c0,c2,c1,ff,e2,ff,e2,c6,e2,c2,e0,c1,d4,從這個壓縮過程可以看到,單個的影象資料 d2、c0、d4 前面帶有計數位元組 c1, 而 20 前沒有。這樣可以有效避免壓縮後膨脹的異常情況。在上述改進的基礎上, 我們發現, 由於乙個位元組最大只能為 ffh, 因此 n 最大只能為 ffh- c0h=3fh=(63)10, 故當 n>63 時, 則需要分多次壓縮。例如132個資料 e2 用了 6個位元組 (ff,e2,ff,e2,c6,e2)來表示。為了減少大批量重複資料所需的位元組數, 我們對其進行更進一步的改進: 規定緊跟 ff 後的位元組, 依然是計數位元組。如上述資料: d2,20,30,30,30,c0,c1,c1,e2,e2,e2,…,e2(132個),e0,e0,d4,經壓縮後資料為:c1,d2,20,c3,30,c1,c0,c2,c1,ff,45,e2,c2,e0,c1,d4。比較兩組資料, 現在 132個資料 e2 用了 3個位元組(ff,45,e2)就可以表示了, 有效地減少了資料量。一種極端的情況是某個資料剛好重複的次數是 ff 次, 對於這種特殊情況, 我們在 ff 位元組後增加乙個 00 的位元組來區別表示。通過這樣的改進, 並不會增加壓縮和解壓縮太多的複雜性, 卻改善了壓縮的效率。
------------------
探 討 rle特點
從前面所給的例子中我們不難看出rle所能獲得的壓縮比有多大,這主要是取決於影象本身的特點。如果影象中具有相同顏色的影象塊越大,影象塊數目越少,獲得的壓縮比就越高。反之, rle對顏色豐富的自然影象就顯得力不從心,在同一行上具有相同顏色的連續畫素往往很少,而連續幾行都具有相同顏色值的連續行數就更少。如果仍然使用rle編碼方法,不僅不能壓縮影象資料,反而可能使原來的影象資料變得更大。因此,具體實現時,需要和其它的壓縮編碼技術聯合應用。
重複次數即行程(run-length)
一種可行的方案是,將資料流中各數值分為兩類:其中一類數值行程小於
或等於128,按原值輸出;另一類數值行程大於128,此類
數值加上128後輸出。綜上所述,改進後的行程編
碼演算法如下:
①對行程小於或等於2的數值按原值輸出;
②對行程大於2的數值,將其加上128後輸
出,並在其後相鄰位置輸出行程大小。
rle演算法的侷限性
在rle資料壓縮中,只有當重複的位元組數大於
3時才可以起到壓縮作用,並且還需要乙個特殊的
字元用作標誌位,因此在採用rle壓縮方法時,必
須處理以下幾個制約壓縮比的問題[8]。
(1)在原始影象資料中,除部分背景影象的畫素
值相同外,沒有更多連續相同的畫素。因此如何提
高影象中相同資料值的問題是提高資料壓縮比的關
鍵;(2)如何尋找乙個特殊的字元,使它在處理的圖
像中不用或很少使用的問題;
(3)在有重複位元組的情況下,如何提高重複位元組
數(最多為255)受限的問題。
行程長度編碼科普
在某些情況下,乙個字元可能在乙個長序列中反覆出現。在英語文字中,這種重複不常見,但在大的資料流中 如dna序列 中,這種情況則經常出現。一種名為行程長度編碼的文字壓縮方法利用了這種情況。行程長度編碼有時又稱為迭代編碼。在行程長度編碼中,重複字元的序列將被替換為標誌字元,後面加重複字元和說明字元重複次...
c筆記 行程長度編碼
之前寫過哈弗曼編碼的壓縮檔案的程式,今天在書上看到乙個更簡單用途單一的壓縮演算法 行程長度編碼 如果檔案包含許多相同位元組的長序列,效果很明顯,實現 如下 include includeint main int argc,char ar char newname 256 strcpy newname...
RLE 壓縮編碼
rle全程run length encoding,翻譯為遊程編碼,又譯行程長度編碼,又稱變動長度編碼法 run coding 在控制論中對於二值影象而言是一種編碼方法,對連續的黑 白畫素數 遊程 以不同的碼字進行編碼。遊程編碼是一種簡單的非破壞性資料壓縮法,其好處是加壓縮和解壓縮都非常快。其方法是計...