2009-03-19 15 views
5

Ho pensato che avrei potuto lavorare da solo, ma non mi sembra di andare avanti.Come creare l'albero Huffman dall'intestazione FFC4 (DHT) nel file jpeg?

Ok, lo sfondo:

Ho bisogno di creare un albero di Huffman di codici dalle informazioni fornite dal FFC4, DHT (Define Huffman Table) un colpo di testa in un file jpg. L'intestazione DHT definisce la tabella di Huffman in questo modo:

1) Una serie di 16 byte. Ogni byte definisce quanti simboli hanno un codice Huffman di n quantità di bit dove n è la posizione del byte nella serie. (Ha fatto che ha alcun senso !!?) Ad esempio i dati grezzi in esadecimale è:

00 01 05 01 01 01 ... 00

ciò significa che:

Num of bits: 1 2 3 4 5 6 7 ... 16 
Num of codes: 00 01 05 01 01 01 01 ... 00 

2) Dopo l'elenco di 16 byte vengono gli stessi simboli effettivi. Per esempio:

00 01 02 03 04 05 06 07 08 09 0A 0B

3) Combinando le due parti si vede che loro sono:
00 codici con 1 bit.
01 codici con 2 bit: in modo da prendere il primo simbolo dalla lista: 00
05 codici con 3 bit: in modo da prendere i prossimi 5 simboli dalla lista: 01 02 03 04 05
.. e così via

4) Infine dobbiamo elaborare i codici Huffman effettivi dalle informazioni di cui sopra. Se sei un genio della matematica, potresti aver già notato che questi codici possono essere risolti semplicemente aumentando un numero binario con il numero appropriato di bit per ogni nuovo codice a una certa lunghezza di bit. Quando la lunghezza del bit aumenta, basta incrementare il numero binario e quindi raddoppiarlo e proseguire. Diventa ovvio per tutti gli altri quando hai estratto un numero di questi alberi binari a mano ...

5) Quindi questo è il codice che ho usato per elaborare i codici Huffman e memorizzarli in un array: (prima ho letto i dati a 1) e metterlo in un array: dhtBitnum)

  int binaryCode = 0; 
      count = 0; 
      StringBuffer codeString = new StringBuffer();    

      //populate array with code strings 
      for (int numBits=1; numBits<=16; numBits++) { 

       //dhtBitnum contains the number of codes that have a certain number of bits 
       for (int i=1; i<=dhtBitnum[(numBits-1)]; i++) { 

        //turn the binary number into a string 
        codeString.append(Integer.toBinaryString(binaryCode)); 
        //prepend 0s until the code string is the right length 
        for(int n=codeString.length(); n<numBits; n++) { 
         codeString.insert(0, "0"); 
        } 
        //put the created Huffman code in an array 
        dhtCodes[count]=codeString.toString(); 
        binaryCode++; 
        count ++; 
        codeString.delete(0, codeString.length()); 
       } 
       binaryCode = binaryCode << 1; 

      } 

volta ho generato i codici di Huffman e memorizzate in ordine, posso solo aggiungere i simboli che si riferiscono in ordine come arrivano in 2). Questo potrebbe non essere terribilmente elegante ma sembra funzionare almeno e crea le tabelle corrette.

6) Se qualcuno lo sta ancora seguendo, meriti una medaglia.

7) Ora il problema è che mi piacerebbe memorizzare queste informazioni in un albero binario in modo da poter decodificare in modo efficiente i dati delle immagini jpg in seguito, piuttosto che cercare ogni volta gli array. Purtroppo non riesco a capire un modo pulito ed efficiente per farlo direttamente dalle informazioni fornite nelle intestazioni jpg come sopra.
L'unico modo che posso pensare è elaborare i codici Huffman come sopra prima, quindi implementare un metodo che crea nodi come necessario e salva i simboli nella posizione appropriata, usando i codici come un indirizzo di sorta.Tuttavia questo sembra un modo tondo che duplica anche le informazioni di cui ho bisogno, sono sicuro che ci deve essere un metodo molto migliore e più semplice.

8) Quindi se qualcuno capisse le mie divagazioni, sarei molto grato per alcuni suggerimenti. Mi rendo conto che questo è un problema molto specifico, ma se non altro le informazioni sopra potrebbero rivelarsi utili a qualcuno. Sono ancora molto nuovo in questo, quindi scusate la mia ignoranza, il codice facile da capire è particolarmente benvenuto!

+0

Questo mi ha aiutato molto. Grazie amico, sei il re: D – MrD

risposta

2

Per quanto riguarda l'implementazione diretta, non sono del tutto sicuro, poiché ci vuole un po 'per elaborare le informazioni, ma l'algoritmo dovrebbe essere piuttosto semplice se si conosce tries. Dal punto 7 sembra che tu non lo faccia?

io aggiungo un esempio:

  ° 
     /\ 
    / \ 
     °  ° 
    /\ /\ 
    a b c d 

In questo semplice trie, se andiamo a sinistra in avanti assumeremo sinistra è un 0, a destra è un 1. Quindi, se si verifica il modello '00' questo corrisponde ad un a. Il motivo "10" corrisponde a un c. Solitamente con alberi di Huffman trie sarà sbilanciato, cioè

 ° 
    /\ 
    a ° 
    /\ 
    b ° 
     /\ 
     c d 

In questo caso, il prefisso '0' corrisponde ad un a. Il codice 111 a una 'd'.

+0

Grazie a wds, i tentativi sono stati menzionati in un altro post su una domanda simile. Non sono sicuro di capire la differenza tra loro e un albero binario. Il problema è che sto avendo problemi a creare il trie/tree direttamente dalle informazioni dell'header DHT. – joinJpegs

+0

Non preoccuparti, mi rendo conto che questa è probabilmente una domanda troppo esoterica per qualsiasi risposta specifica. Speravo un po 'di cadere su un guru jpg con il proprio decoder che poteva lanciare un codice già pronto a modo mio! – joinJpegs

+0

Hmmm potresti modificare la tua domanda per spiegare come sai che il simbolo con, diciamo, due bit è codificato come 00 e non 11 per esempio? Quindi posso probabilmente trovare un algoritmo. – wds

0

Come ha detto @wds, cerca aiuto. L'idea alla base della decodifica di Huffman è che i bit del codice seqence dovrebbero essere usati per "camminare" sul trie, tenendo una sinistra quando il codice ha uno 0 e un diritto per un 1, fino a quando la parola codice finisce. Quindi sarai nel nodo trie che memorizza i dati di sostituzione per quel codice.

+0

Pensavo di essere un po 'laconico, quindi ho appena aggiunto un esempio per suscitare proprio questo punto. :) – wds

Problemi correlati