簡體   English   中英

JPEG霍夫曼表

[英]JPEG Huffman Table

我對JPEG Huffman表以及使用Huffman表從樹中構造符號/二進制字符串有疑問。 假設在3-Bit代碼長度的霍夫曼表中,代碼數大於6,那么我們如何在樹中添加所有這些代碼? 如果我是正確的,那么只能在樹的3位級別/深度處添加6個代碼。 那么,如果剩余的代碼不適合該級別,我們如何添加呢? 我們只是忽略它們嗎?

code length | Total Codes | Codes  
3-Bit       |    10       | 25 43 34 53 92 A2 B2 63 73 C2

在上面的示例中,如果按照為代碼構造符號/二進制字符串的順序進行操作,那么直到A2為止,我們都可以在樹中的3位級別添加代碼,但是B2、63、73,C2等呢? 不可能在樹的3位級別上添加它們嗎? 那么我們如何處理他們?

好吧,很明顯,可以用3位表示的“事物”的絕對最高數量是8-(000、001、010、011、100、101、110、111)。

在霍夫曼編碼中,位表示trie數據結構中的“左”或“右”,為了能夠“繼續”,您必須對“這繼續另一個級別”使用一些代碼,這就是為什么不是所有8個值都可以以3位編碼。 如果您要編碼的值更多,則需要使用更多的位(對於某些值-這是霍夫曼編碼的全部要點,即某些組合比原始組合短,其他組合甚至更長,有時甚至更長,但這是因為它是基於在最常見的情況下,這很好,因為它們很少見...)

在典型的《算法》一書中,如何構造和解碼霍夫曼樹大約需要四到五頁,如果您還沒有找到其中的一本,您可能想找到一本,無論是一本真正的紙質書還是一本電子書。 有很多-我不推薦一個,因為我所有的都大約15歲以上。

我還要補充一點,我認為您的問題缺少一些內容。 顯然,3位不可能代表10個值。 而且,您無法在全部不同的10個值上構建[有意義的]哈夫曼樹-除非想法是將這些值分成成對的{2,5}, {4,3}, {3,4}, {5,3}, {9,2}, {A,2}, {B,2}, {6,3}, {7,3}, {C,2} -給出相當數量的重復值-頻率其中包括:2:5 3:5 4:2 5:2 6:1 7:1 9:1 A:1 B:1 C:1

但這實在太多了,無法代表任何有意義的東西...

還是反過來,我們應該使用那些位的值進行解碼? 在這種情況下,我們需要使用原始數據構建的樹來對其進行解碼...

在JPEG中,霍夫曼碼最多可以為16位。 DHT市場包含16個元素的數組,給出了每種長度的代碼數量。

JPEG標准說明了如何使用代碼計數進行霍夫曼翻譯。 這是詳細解釋的少數事情之一。

本書從程序員的角度解釋了它是如何完成的。

JPEG書

任何代碼長度上存在的代碼數量取決於其他長度的計數。

我想知道您是否真的在看長度為4而不是3的代碼計數。

從JPEG表創建霍夫曼代碼時,您似乎未遵循正確的步驟。 除非表已損壞,否則提供的計數將適合位數。 從DHT標記中讀取代碼非常簡單。 更復雜的部分是如何根據該數據定義查找表。 邏輯(但不實際)的方法是創建一個反向查詢表,該表的大小為最大代碼長度(表中的16位= 65536個條目)。 然后,要解碼JPEG數據,只需從輸入流中提取16位壓縮數據並將其用作表中的索引,即可在其中獲得符號和代碼的實際長度。 我想出了一種使用單個較小的查找表的方法。 我不會分享我的特定代碼表方法。 我將分享的是從DHT標記創建代碼的循環的基本格式:

int iCurrentCode; // the current Huffman code
int iLength; // the code length in bits that you're working on
int i;
int iCount; // the number of codes defined for this length
int iSymbol; // JPEG symbol defined for each Huffman code
unsigned char *pData; // pointer to the data in the DHT marker

iCurrentCode = 0; // start with a Huffman code of 0
for (iLength = 1; iLength <= 16; iLength++)
{
    iCount = *pData++; // get number of symbols for this bit length
    for (i=0; i<iCount; i++) // read each of the codes for this bit length
    {
        iSymbol = *pData++; // get the JPEG symbol value (e.g. RRRR/SSSS value)
        // It's up to you to create a lookup table from the code and its value
        iCurrentCode++; // the Huffman bit pattern just increments for each code value
    } // for each code defined at this bit length
    iCurrentCode <<= 1; // shift the code left 1 bit to advance to the next bit length
} // for each bit length

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM