IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

décodage JPEG : arbres de Huffman


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut décodage JPEG : arbres de Huffman
    Bonjour,

    je cherche à développer un plugin minimal pour le décodage de fichiers JPEG. Mon problème porte sur la reconstitution d'arbres de Huffman lors du décodage.

    Je rappelle les infos que l'on extrait du fichier JPEG (section DHT) pour ce faire :
    - le nombre de codes de longueur 1,2,3,...,14,15,16 (un code est une séquence de 0 et 1)
    - les données en question (qui ne sont pas des codes, d'où la nécessité de reconstruire le ou les arbres de Huffman)


    Quelqu'un connaît-il un algorithme "connu" ou "normalisé" pour reconstruire les arbres de Huffman à partir de ces données extraites de fichiers JPEG? Ou à défaut, un code open source ciblé? Ou alors des pistes pour l'algo? L'information est faible sur le net...

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par franklin626 Voir le message
    L'information est faible sur le net...
    Heu... "Huffman" sur le net, c'est 16 millions de réponses : dire que c'est "faible", c'est dire "je n'ai pas cherché" plutôt !!

    http://fr.wikipedia.org/wiki/Norme_JPEG
    http://fr.wikipedia.org/wiki/Codage_de_Huffman
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Je connais le principe de Huffman :-)
    Ce que je cherchais, c'était les applications spécifiques en imagerie, rien à voir avec le principe, et après avoir "beaucoup cherché", je doute qu'il y ait 16 millions de réponses relevantes.

    Cela dit, merci pour cette participation, j'ai résolu mon problème en partie.

    PS : j'ai consulté Wikipédia il y a bien longtemps et même lu des textes de brevet avant d'ennuyer les gens sur ce forum

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Sinon tu as des implémentations de dispo. Par exemple celle de Cristian Cuturicu -> ici.

    Il y a meme un joli readme qui explique l'algo :

    Citation Envoyé par extrait du readme
    8) The final step === Huffman coding
    -------------------------------------

    First an IMPORTANT note : Instead of storing the actual value , the JPEG standard
    specifies that we store the minimum size in bits in which we can keep that value
    (it's called the category of that value) and then a bit-coded representation
    of that value like this:

    Values Category Bits for the value
    0 0 -
    -1,1 1 0,1
    -3,-2,2,3 2 00,01,10,11
    -7,-6,-5,-4,4,5,6,7 3 000,001,010,011,100,101,110,111
    -15,..,-8,8,..,15 4 0000,..,0111,1000,..,1111
    -31,..,-16,16,..,31 5 00000,..,01111,10000,..,11111
    -63,..,-32,32,..,63 6 .
    -127,..,-64,64,..,127 7 .
    -255,..,-128,128,..,255 8 .
    -511,..,-256,256,..,511 9 .
    -1023,..,-512,512,..,1023 10 .
    -2047,..,-1024,1024,..,2047 11 .
    -4095,..,-2048,2048,..,4095 12 .
    -8191,..,-4096,4096,..,8191 13 .
    -16383,..,-8192,8192,..,16383 14 .
    -32767,..,-16384,16384,..,32767 15 .


    In consequence for the previous example:
    (0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)

    let's encode ONLY the right value of these pairs, except the pairs that are
    special markers like (0,0) or (if we would have) (15,0)


    57 is in the category 6 and it is bit-coded 111001 , so we'll encode it
    like (6,111001)
    45 , similar, will be coded as (6,101101)
    23 -> (5,10111)
    -30 -> (5,00001)
    -8 -> (4,0111)
    1 -> (1,1)

    And now , we'll write again the string of pairs:

    (0,6), 111001 ; (0,6), 101101 ; (4,5), 10111; (1,5), 00001; (0,4) , 0111 ;
    (2,1), 1 ; (0,0)

    The pairs of 2 values enclosed in bracket paranthesis, can be represented on a
    byte because of the fact that each of the 2 values can be represented on a nibble
    (the counter of previous zeroes is always smaller than 15 and so it is the
    category of the numbers [numbers encoded in a JPG file are in range -32767..32767]).
    In this byte, the high nibble represents the number of previous 0s, and the
    lower nibble is the category of the new value different by 0.

    The FINAL step of the encoding consists in Huffman encoding this byte, and then
    writing in the JPG file, as a stream of bits, the Huffman code of this byte,
    followed by the remaining bit-representation of that number.

    For example, let's say that for byte 6 ( the equivalent of (0,6) ) we have a
    Huffman code = 111000;
    for byte 69 = (4,5) (for example) we have 1111111110011001
    21 = (1,5) --- 11111110110
    4 = (0,4) --- 1011
    33 = (2,1) --- 11011
    0 = EOB = (0,0) --- 1010

    The final stream of bits written in the JPG file on disk for the previous example
    of 63 coefficients (remember that we've skipped the first coefficient ) is
    111000 111001 111000 101101 1111111110011001 10111 11111110110 00001
    1011 0111 11011 1 1010
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup pour cette réponse


  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par franklin626 Voir le message
    Je connais le principe de Huffman :-)
    C'est toujours le même principe utilisé un peu partout, même la variante Shannon-Fano n'est pas si différente du principe de base...

    Citation Envoyé par franklin626 Voir le message
    Ce que je cherchais, c'était les applications spécifiques en imagerie, rien à voir avec le principe, et après avoir "beaucoup cherché", je doute qu'il y ait 16 millions de réponses relevantes.
    Ce n'est justement pas si spécifique que ça, à quelques réglages près que l'on trouve dans la description du format JPEG. Dans le JPEG, Huffman ne sert pas à compresser l'image elle-même, mais seulement à optimiser un peu plus la compression en réduisant un peu plus la taille du fichier résultat.

    Citation Envoyé par franklin626 Voir le message
    PS : j'ai consulté Wikipédia il y a bien longtemps et même lu des textes de brevet avant d'ennuyer les gens sur ce forum
    Tu as mal regardé alors : en bas de la page que je t'ai linké sur Wikipédia, tu as un lien externe vers ... une implémentation de Huffman en C.
    Idem sur le lien "comment ça marche".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Echange des noeuds d'un Arbre de Huffman
    Par tompote dans le forum C
    Réponses: 2
    Dernier message: 21/01/2011, 10h26
  2. [arbre de Huffman] probleme de codage.
    Par kromartien dans le forum C
    Réponses: 0
    Dernier message: 01/04/2009, 19h16
  3. arbre d'huffman
    Par junior7872 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 23/05/2005, 23h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo