1的全稱是什麽?LZW嗎?
倫佩爾-齊夫-韋爾奇(LZW)。
2.LZW的引入和壓縮原理是什麽?
LZW壓縮算法是壹種新穎的壓縮方法,由萊姆普爾-齊夫-韋爾奇創立並以他們的名字命名。它采用了高級的字符串表壓縮,將每個第壹個字符串放在壹個字符串表中,並使用壹個數字來表示該字符串。壓縮後的文件只存儲數字,不存儲字符串,大大提高了圖像文件的壓縮效率。神奇的是,這個字符串表可以在壓縮或解壓縮過程中正確建立,並且在壓縮或解壓縮後被丟棄。
在LZW算法中,首先建立壹個字符串表,將每個首次出現的字符串放入字符串表中並用壹個數字表示,該數字與字符串在字符串表中的位置有關,並將該數字存儲在壹個壓縮文件中。如果該字符串再次出現,它可以被代表它的數字替換,並且該數字存儲在文件中。壓縮後丟棄字符串表。例如,如果“print”字符串在壓縮時由266表示,則每當它再次出現時都將由266表示,並且“print”字符串將存儲在字符串表中。當在圖像解碼過程中遇到數字266時,可以從字符串表中找到由266表示的字符串“print”,並且可以在解壓縮時根據壓縮數據重新生成字符串表。
3.在詳細介紹算法之前,先列出壹些與算法相關的概念和詞匯。
1)“字符”:壹個字符,壹個基本的數據元素,在普通文本文件中占據1個單獨的字節,但在圖像中,它是壹個表示給定像素顏色的索引值。
2)“CharStream”:數據文件中的字符流。
3)“前綴”:前綴。就像這個詞的意思壹樣,它代表了壹個字符之前最直接的字符。前綴字符的長度可以是0,前綴和字符可以組成壹個字符串。
4)“後綴”:後綴,它是壹個字符。壹個字符串可以由(A,B)組成。a是前綴,b是後綴。當A的長度為0時,它表示根。
5)‘Code:代碼,用於表示字符串的位置編碼。
6)“條目”,壹個代碼及其代表的字符串。
4.壓縮算法的簡單示例並不是要完全實現lzw算法,而是從最直觀的角度來看待LZW算法的思想。
原始數據的LZW壓縮。
在原始數據中,只有四個字符(A,B,C,D),可以用壹個2-2位的數字表示,0-A,1-B,2-C,3-D .從最直觀的角度來看,原始字符串有重復的字符:ABCCAABCDDAACCDB,4表示AB,5。
5.5 .適用範圍。LZW算法
為了區分代表字符串的值(代碼)和原始的單個數據值(字符串),有必要使它們的數值字段不重合,0-3用於代表A-D,因此AB必須由大於3的數值替換。再如,原始數值範圍可以用8位表示,因此認為原始數值範圍為0 ~ 255,壓縮程序生成的標簽範圍不能為0 ~。我們只能從256開始,但這將超出8位表示的範圍,因此我們必須將數據位數至少擴展壹位,但這不會增加1個字符所占用的空間嗎?然而,壹個字符可以代表幾個字符。例如,255過去是8位,但現在值得使用256來表示兩個數字,即254和255。從這個原理可以看出,LZW算法的適用範圍是原始數據串應該有大量重復多次的子串,重復次數越多,壓縮效果越好。相反,情況越糟糕,實際上可能越是增加而不是減少。
6.6號特殊標誌。LZW算法
隨著新字符串的發現,標簽將繼續增長。如果原始數據太大,生成的標簽表將變得越來越大。此時,操作此集合將導致效率問題。如何避免這個問題?Gif使用lzw算法的方式是,當標簽集足夠大時,它顯然不會增加,因此只需從頭開始。在這個位置插入了壹個標簽,這意味著我重新開始構造字典,之前的所有標簽都無效並開始使用新的標簽。
這時,另壹個問題出現了。它有多大?這個標簽集的合適大小是多少?理論上,標簽集越大,壓縮比越高,但開銷也越高。壹般根據處理速度和內存空間來選擇。GIF規範規定12位,如果表達式範圍超過12位,將重新創建。為了提高壓縮率,GIF使用可變字長。例如,原始數據是8位,所以在開始時,先添加壹位,初始字長變為9位,然後開始添加標簽。當標簽被添加到512時,即當超過9是可以表示的最大數據時,這意味著後面的標簽只能用10位表示,因此從這裏開始,後面的字長為10。以此類推,當它達到2 12,即4096時,在此處插入壹個清晰的符號,從後面開始,從9位數字開始。
GIF指定的清除標誌的值是原始數據字長的最大值加上1。如果原始數據字長為8,則清除標誌為256,如果原始數據字長為4,則為16。此外,GIF還指定了壹個結束標誌END,其值為清除標誌加1。因為GIF中指定的位數是1(單色圖像)、4(16彩色)和8(256彩色),如果在1位的情況下僅擴展1位來表示4種狀態,那麽添加清除標誌和結束標誌將被用完,因此1位將被用完。在其他兩種情況下,初始字長分別為5位和9位。/whycadi/
7.lzw算法壓縮原始數據的實例分析
輸入流,即原始數據為:255,24,54,255,24,255,24,5,123,45,255,24,5,24,54。..................
這只是gif文件中像素數組的壹部分。怎麽壓縮?
因為原始數據可以用8位表示,所以清除標誌是Clear=255+1 =256,結束標誌是End=256+1=257,當前標簽集是
0 1 2 3 .................................................................................255清除結束
第壹步是將第壹個字符讀為255,並在標記表中查找它。255已經存在,我們已經知道255,所以我們不處理它。
第二步,取第二個字符,此時前綴為a,當前條目為(255,24),該條目在標簽集中不存在。我們不知道255,24。這壹次,當妳的男孩來時,我會記住妳,在標簽集中將其標記為258,然後輸出前綴A,保留後綴24,並將其作為下壹個前綴(後綴更改前綴)。
第三步,取第三個字符為54,當前條目(24,54),我不知道,記錄(24,54)為數字259,輸出24,後綴改為前綴。
第四部分:取第四個字符255,Entry =(54,255),我不知道,記錄(54,255)為參考數260,輸出54,並將後綴改為前綴。
第五步取第五個字符24,entry =(255,24),啊,我認識妳,這不是舊的258嗎,所以字符串指定為258並用作前綴。
第六步:取第六個字符255,entry =(258,255),我不知道,記錄(258,255)為261,輸出258,將後綴改為前綴。
.......
處理直到最後壹個字符,
用表格記錄這個過程。
清除=256,結束=257
第壹步前綴後綴輸入已知(Y/N)輸出標簽。
1 255 (,255)
N 255 258
24 54(24,54)N 24 259
N 54 260
255 24(255,24)Y
6 258 255(258 255)N 258 261
N 255 262
.....
上面的壹些例子不能完全反映出來。另壹個例子是
原始輸入數據為:ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA。.....
使用LZW算法對其進行壓縮,壓縮過程表示為表:
註意,原始數據只包含四個字符,A、B、C、D、B、C和D。
它可以用兩位來表示。根據lzw算法,首先將壹位擴展為3,Clear的二次方= 2+1 = 4;end = 4+1 = 5;
初始標簽集應該是
0 1 2 3 4 5
清晰的結尾
壓縮過程是:
第壹步前綴後綴輸入已知(Y/N)輸出標簽。
1 A(,A)
2 A B(A,B)N a6
3 B A(B,A)N B 7
4a B(A,B)Y
56 A(6,A)N 6 8
6a B(A,B)Y
7 6a(6,A)Y
8 8 B(8,B)N 8 9
9 B B(B,B)N B 10
10 B B(B,B)Y
11 10 A(10,A)N 10 11
12 A B(A,B)Y
.....
當轉到步驟12時,標簽集應為
0 1 2 3 4 5 6 7 8 9 10 11
6A 8B BB 10A
8.8的偽代碼實現。LZW算法
1STRING =獲取輸入字符
2當仍有輸入字符時
3字符=獲取輸入字符
4如果字符串+字符在字符串表中,則
5字符串=字符串+字符
6其他
7輸出字符串的代碼
8將字符串+字符添加到字符串表中
9字符串=字符
10 IF結束
11 WHILE結束
12輸出字符串的代碼
13