編譯碼 霍夫曼編譯碼

2021-08-21 19:24:22 字數 2171 閱讀 7225

1.檔案源

原始影象分塊為(8*8),在rle編碼之後做霍夫曼編碼。其中rle碼字格式如下。

struct rlecode

;

2.構建霍夫曼表

本文中使用的為jpeg標準ac_y霍夫曼表。構建乙個256維大小的碼表hufftable,其霍夫曼碼字結構如下。

struct huffcode

;

3.關鍵幀霍夫曼編碼

(8*8*3)的3通道影象塊編碼為rlebuf[rlelength],

for(int i = 0; i < rlelength; i++)

else

}

rle碼字為0時,以霍夫曼表中索引為0處的碼字表示0,既寫入hufftable[0]的相應碼字,每達到15個0則寫入乙個hufftable [0xf0]碼字表示15個0,解碼與之對應。其表示如下:

processzero()

//寫入剩餘0的碼字

for (int j = 0; j < (temprle. runlen %15); j ++)

}

rle碼字為0時的第二種處理方式:寫入hufftable[0]的相應碼字代表該元素是0,沒有對0進行編碼,所有其編碼長度為0.

processzero()

rle碼字為非0時,寫入對應索引處碼字的二進位製流,以及該碼字的相應編碼,其索引計算方式如下。

//資料二進位制編碼格式

struct bincode

;processnonzero()

二進位制編碼如下表所示,為其數值以及對應的二進位制值,以及長度。給定乙個值value,其處理過程如下

bincode buildsym2(value)

else

return tempbin;

}//返回符號的長度

uchar computevli(short val)

else if(val >= 2 && val <= 3)

.. .

return binstrlen;

}

對於元素的編碼長度根據下面的標準確定:(由元素的絕對值確定碼長)

元素值範圍

編碼長度

元素值範圍

編碼長度11

[256,511]

9[2,3]

2[512,1023]

10[4,7]

3[1024,2047]

11[8,15]

4[2048,4095]

12[16,31]

5[4096,8191]

13[32,63]

6[8192,16383]

14[64,127]

7[16384,32767]

15[128,255]

8---

---4.參考幀霍夫曼編碼

將影象參考幀標記為不同的塊,存入相應的差值,short型別,並進行rle編碼,然後進行霍夫曼編碼,方法與3中的關鍵幀霍夫曼編碼相同,此處不再贅述。

5.依次迴圈完成所有影象霍夫曼編碼。

原始檔儲存的是二進位製碼流。解碼過程如下:

1)取得乙個在hufftable中索引為index的huffman碼(使用huffman表的jpeg標準ac_y霍夫曼表);

2) 取得index的高四位是該數值的個數samecount,取得低四位表示該數值的二進位制位數codelen;

3)根據低四位從二進位製碼流中取得相應位數的資料value;

4)根據value以及codelen求得實際數值。

if(value的codelen-1位為0)

else

5)根據samecount將(samecount+1)個value儲存在乙個192大小的buffer中。

重複步驟1)-5),直到儲存192個資料為止。

1. 關鍵幀解碼

根據以上步驟,解得所有分塊的192個資料。將分塊資料合併為影象資料,完成了關鍵幀影象的解碼。

2. 參考幀解碼

根據以上步驟,解得所有差值塊的192個差值資料。根據前一幀資料和解得的差值資料計算出當前參考幀的影象資料,完成了參考幀影象的解碼。

貪心演算法實現霍夫曼編譯碼

霍夫曼編碼是一種被廣泛應用而且非常有效的資料壓縮技術,根據待壓縮資料的特徵,乙個可壓縮掉20 90 這裡考慮的資料指的是字串序列。要理解霍夫曼編碼,先要理解霍夫曼樹,即最優二叉樹,是一類帶權路徑長度最短的樹。路徑是指從樹中乙個結點到另乙個結點之間的通路,路徑上的分支數目稱為路徑長度。樹的路徑長度是從...

編碼 解碼 中文編譯碼

字串和字符集的關係 字串是python程式的一種格式 位元組串是網路傳輸的一種形式 字串和位元組串轉換 字串 str encode 位元組串 bytes 位元組串 bytes decode 字串 str ascii字符集是utf 8字符集的前128位字元,可以說ascii字符集是utf 8字符集的子...

編譯碼,拷貝

s alex assicc碼 utf 8和gbk的英文是asicc碼 s1 s.encode utf 8 utf 8轉化為位元組 print s1.decode gbk 位元組轉化為gbk 刪除列表的兩個方法 li 1,2,3,4,5,6 lst for i in li for n in lst l...