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

MATLAB Discussion :

codage jpeg d'image


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut codage jpeg d'image
    bonjour,
    j'ai pas pu corriger ce code de codage jpeg en matlab, j'ai pas compris la faute.
    est ce que vous pouvez m'aider?
    MERCI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    img_originale=rgb2gray(double(imread('lena.jpg')));
    jpeg=ones(size(img_originale));
    dim_bloc=8;%matrice jpeg qui va contenir l'image compressé
    jpeg_deco=ones(size(jpeg));%matrice qui va contenir l'image decomprésse
    offset=ones(dim_bloc,dim_bloc)*128;%matrice 8x8 pour level shifting
    DCT=dctmtx(dim_bloc);%matrice C pour le calcul de F
    %récupération des dimensions de l'image
    a=size(img_originale);
    m=a(1);
    n=a(2);
    dim_img=m*n;
    zigzag=ones([1 dim_img]);
    [col lig]=init_indices_zigzag(dim_bloc);
     
    rle= [];
    rle_deco= [];
    huff_deco= [];
    hcode=[];
    %constantes initiales
    taux_compression=0;
    taille_img_compresser=0;
    dec_l=0;
    dec_c=0;
    redaondance=0;
    col_rle_p=1;
    k=1;
    z=1;
    d=0;
    quantizer=[16 11 10 16  24  40  51  61
               12 12 14 19  26  58  60  55
               14 13 16 24  40  57  69  56
               14 17 22 29  51  87  80  62
               18 22 37 56  68 109 103  77
               24 35 55 64  81 104 113  92
               49 64 78 87 103 121 120 101
               72 92 95 98 112 100 103 99];
     
     
     
     for i=1:dim_bloc:m
        dec_l=i-1;
        for j=1:dim_bloc:n
            dec_c=j-1;
            jpeg(i:i+7,j:j+7)=img_originale(i:i+7,j:j+7)-offset;
            jpeg(i:i+7,j:j+7)=DCT*jpeg(i:i+7,j:j+7)*DCT';
            jpeg(i:i+7,j:j+7)=jpeg(i:i+7,j:j+7)./quantizer;
            jpeg(i:i+7,j:j+7)=round(jpeg(i:i+7,j:j+7));
            for q=1:64
                zigzag(k)=jpeg(lig(q)+dec_l,col(q)+dec_c);
                k=k+1;
            end
            d=k-64;
            q=1;
            while(q<=64)
                if (d<dim_img) && (zigzag(d) ~= zigzag(d+1))
                    rle(z)=zigzag(d);
                    d=d+1;
                    q=q+1;
                    z=z+1;
                elseif (d<dim_img) && (zigzag(d) == zigzag(d+1)) && (zigzag(d+1) ~= zigzag(d+2))
                    rle(z)=zigzag(d);
                    rle(z+1)=zigzag(d+1);
                    rle(z+2)=zigzag(d+2);
                    d=d+3;
                    q=q+3;
                    z=z+3;
                elseif (d<dim_img) && (zigzag(d) == zigzag(d+1)) && (zigzag(d+1) == zigzag(d+2)) && (zigzag(d+2)==zigzag(d+3))
                    redondance=4;
                    rle(z)=257;
                    rle(z+1)=redondance;
                    rle(z+2)=zigzag(d);
                    d=d+3;
                    q=q+4;
                    while (q<=64) && (d<dim_img) && (zigzag(d) == zigzag(d+1))
                        redondance= redondance+1;
                        q=q+1;
                        d=d+1;
                    end
                    rle(z+1)=redondance;
                    d=d+1;
     
                     z=z+3;
                    end
                    if (q==64)
                        q=q+1;
                    end
                end
     
     
                col_rle=z-1;
                symboles=unique(rle(col_rle_p:col_rle));
                nbr_symboles=numel(symboles);
                taille_block=numel(rle(col_rle_p:col_rle));
     
                      %calcul des probabilités de chaque symboles
                      table_p=ones(1,nbr_symboles);
                      for q=1:nbr_symboles;
                          itter=0;
                          for r=col_rle_p:col_rle
                              if (rle(r)==symboles(q))
                                  itter=itter+1;
                              end
                          end
                          table_p(q)=itter/taille_block;
                      end
                      %dressage de l'arbre de huffman et codage de chaque
                      %symbole de chque sous bloc.
                      eval([sprintf('dico_&d_&d=huffmandict(symboles,table_p);',i,j)]);
                      eval([sprintf('hcode_&d_&d=huffmanenco(rle(col_rle_p:col_rle),dico_&d_&d);',i,j,i,j)]);
                      col_rle_p=col_rle+1;
        end
     
     end

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Citation Envoyé par etudiante-m Voir le message
    j'ai pas compris la faute.
    Montre nous au moins le message d'erreur.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut
    voici l'erreur:
    ??? Error: The expression to the left of the equals sign is not a
    valid target for an assignment.
    
    Error in ==> codage_jpeg at 111
                      eval([sprintf('dico_&d_&d=huffmandict(symboles,table_p);',i,j)]);

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Je te renvoie à cette entrée de la FAQ : Comment créer des variables nommées A1, A2, A3, ..., AN ?

    Cela ne corrigera pas l'erreur que tu fais avec SPRINTF mais devrait (normalement) te convaincre de ne pas utiliser EVAL.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut
    merci bien pour votre aide, mais comment je peux changer la fonction eval?

  6. #6
    Invité
    Invité(e)
    Par défaut
    En utilisant un tableau de cellules, comme indiqué dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico{i,j} = huffmandict(symboles,table_p);
    hcode{i,j} = huffmanenco( rle(col_rle_p:col_rle), dico{i,j} );
    Pour information, c'est le symbole % et non & qu'il faut utiliser dans sprintf, et les crochets sont inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eval([sprintf('dico_%d_%d=huffmandict(symboles,table_p);',i,j)]);
    eval([sprintf('hcode_%d_%d=huffmanenco(rle(col_rle_p:col_rle),dico_%d_%d);',i,j,i,j)]);

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut
    merci, tu m'as bcp aidé.

    mais lorsque, j'ai changé eval,en étape de décodage,il y a d'autres erreurs que je l'ai pas compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    %décodage huffman
    for i=1:dim_bloc:m
        for j=1:dim_bloc:n
           % eval([sprintf('huff_deco=[huff_deco huffmandeco(hcode_&d_&d,dico_&d_&d)];',i,j,i,j)]);
            huff_deco{i,j}=huffmandeco( hcode{i,j},dico{i,j});
        end
    end
    %décodage rle
    i=1;
    k=1;
    while(k<=numel(huff_deco))
     
        if(huff_deco(k)==257)
            rle_deco(i:(i-1+huff_deco(k+1)))=huff_deco(k+2);
            i=i+huff_deco(k+1);
            k=k+3;
        else
            rle_deco(i)=huff_deco(k);
            i=i+1;
            k=k+1;
        end
    end
    k=1;
    for i=1:dim_bloc:m
        dec_l=i-1;
        for j=1:dim_bloc:n
            dec_c=j-1;
            %scan zigzag inverse
            for q=1:64
                img_decompresse(lig(q)+dec_l,col(q)+dec_c)=rle_deco(k);
                k=k+1;
            end
            %quantification inverse+ idgt+ remises des niveaux (inverse level
            %shifting
            img_decompresse(i:i+7,j:j+7)=img_decompresse(i:i+7,j:j+7).*quantizer;
            img_decompresse(i:i+7,j:j+7)=DCT'*img_decompresse(i:i+7,j:j+7)*DCT;
            img_decompresse(i:i+7,j:j+7)=img_decompresse(i:i+7,j:j+7)+offset;
        end
    end

    voici l'erreur:
    ??? Undefined function or method 'eq' for input arguments of type 'cell'.
    
    Error in ==> cod_jpeg at 144
        if(huff_deco(k)==257)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas la seule ligne à changer comme cela.

    Je t'invite vraiment à suivre le lien de la FAQ sur les tableaux de cellules, et à le comprendre.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut
    bonjour,
    moi aussi, j'ai le même problème...

    voila le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    %décodage huffman
    for i=1:dim_bloc:m
        for j=1:dim_bloc:n
            %eval([sprintf('huff_deco=[huff_deco huffmandeco( hcode_&d_&d,dico_&d_&d)];' ,i,j,i,j)]);
           huff_deco{i,j} = huffmandeco(hcode{i,j},dico{i,j});
     
                      %huff_deco{i,j}=huffmandeco( hcode{i,j},dico{i,j});
        end
    end
    %décodage rle
    i=1;
    k=1;
    while(k<=numel(huff_deco))
     
        if(huff_deco{k}==257)
            rle_deco(i:(i-1+huff_deco{k+1}))=huff_deco{k+2};
            i=i+huff_deco{k+1};
            k=k+3;
        else
            rle_deco{i}=huff_deco{k};
            i=i+1;
            k=k+1;
        end
    end
    k=1;
    for i=1:dim_bloc:m
        dec_l=i-1;
        for j=1:dim_bloc:n
            dec_c=j-1;
            %scan zigzag inverse
            for q=1:64
                img_decompresse(lig(q)+dec_l,col(q)+dec_c)=rle_deco{k};
                k=k+1;
            end
            %quantification inverse+ idgt+ remises des niveaux (inverse level
            %shifting
            img_decompresse(i:i+7,j:j+7)=img_decompresse(i:i+7,j:j+7).*quantizer;
            img_decompresse(i:i+7,j:j+7)=DCT'*img_decompresse(i:i+7,j:j+7)*DCT;
            img_decompresse(i:i+7,j:j+7)=img_decompresse(i:i+7,j:j+7)+offset;
        end
    end
    et voila l'erreur:
    ??? Subscripted assignment dimension mismatch.
    
    Error in ==> decodage_jpeg at 33
                img_decompresse(lig(q)+dec_l,col(q)+dec_c)=rle_deco{k};
    même si j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img_decompresse(lig(q)+dec_l,col(q)+dec_c)=rle_deco{k};

  10. #10
    Invité
    Invité(e)
    Par défaut
    Subscripted assignment dimension mismatch.

    J'attire ton attention sur ce que retourne rle_deco{k} et le type de ta variable img_decompresse (ainsi que la taille de img_decompresse(lig(q)+dec_l,col(q)+dec_c)).

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2012
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 95
    Points : 26
    Points
    26
    Par défaut
    merci bien pour votre aide

Discussions similaires

  1. [Débutant] Codage et decodage image avec clé
    Par chattachatta dans le forum Images
    Réponses: 6
    Dernier message: 07/04/2011, 12h49
  2. Réponses: 2
    Dernier message: 28/05/2007, 14h15
  3. Codage d'une image en base64
    Par Pierre Fauconnier dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 30/03/2007, 17h51
  4. Récupération du codage d'une image
    Par Cedwik dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/09/2006, 15h59
  5. Réponses: 5
    Dernier message: 18/05/2005, 14h03

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