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...