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

Algorithmes et structures de données Discussion :

jpeg2000


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 3
    Par défaut jpeg2000
    Salut,

    Je suis en MP, et souhaite comprendre dans le détail le jpeg2000.
    J'ai cherché sur google et yahoo, mais je ne trouve pas ce que je souhaite.
    La partie du jpeg2000 qui pose problème est celle qui utilise les ondelettes (transformée en ondelette). Je n'ai pas encore trouvé un site qui explique dans le détail.
    D'apres ce que j'ai compris, on peux se limiter au cas de l'ondelette de Haar..., mais comment construit on les bases des espaces vectoriels "allure générale" et "détail"? Puis comment passe t on de la dimension une à la dimension 2 (pour compresser une image)?
    Sinon, on voit toujours le meme exemple : la maison qui est divisée en 2 puis encore en 2 : l'image "allure générale" n'est pas dure à calculer, mais comment obtient on les images "détails"?

    Si qqun à un tutorial, un bon site, ou s'y connait dans ce domaine, ça serait vraiment cool de me donner un petit coup de main
    Merci d'avance.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir
    Il y a quelque temps, j'avais trouvé le site d'un TIPE qui traitait (bien) de la compression : http://donut.99.free.fr/En-vrac/tipe/ondelettes.htm

    est ce cela que tu cherches ou encore plus pointu ?

  3. #3
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 3
    Par défaut
    Merci pour ta réponse.
    J'ai croisé ce site aussi, et l'ai mis dans mes favoris.

    Il donne les grandes lignes de la partie qui m'intéresse, mais si on creuse un peu, ça reste trop vague...

  4. #4
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 3
    Par défaut
    pour commencer simplement, qqun peux il appliquer la transformation via les ondelettes de la matrice (image 4pxl sur 4, en 256 niveau de gris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    255 255 255 000
    255 255 000 000
    255 000 000 000
    000 000 000 000
    (j'ai mis 3 zéro pour l'allignement)

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    /**************************************************
    *	Fichier : FastSymmlet8.C
    *	Format : ANSI C++
    *
    * (c) 1998-2002 Daniel Lemire, Ph.D.
    * http://www.ondelette.com/ - wavelet forum - forum sur les ondelettes
    *
    * Last modified on March 6th 1998
    * Dernière modification le 6 mars 1998
    *
    * Free for any use, but this copyright notice must remain.
    * Provide as is. Use at your risks.
    *
    * Gratuit pour toute utilisation, mais préservez cette mention.
    * Sans garantie aucune, utilisez à vos risques.
    *
    * C++ implementation of the Symmlet8 wavelet.
    * See end of the file for usage.
    *
    * Cette classe utilise les ondelettes Symmlet8. Son
    * utilisation est très simple (voir la fin du fichier
    * pour un exemple). Elle suppose des conditions périodiques
    * aux bords.
    *
    ***************************************************/
     
    #include <iostream.h>
     
    	  static const float scale[8] = {0.0322231006040782f,
    	                                -0.0126039672622638f,
    	                                -0.0992195435769564f,
    	                                0.297857795605605f,
    	                                0.803738751805386f,
    	                                0.497618667632563f,
    	                                -0.0296355276459604f,
    	                                -0.0757657147893567f};
    	  static const float wavelet[8] = {0.0757657147893567f,
    	  				-0.0296355276459604f,
    	  				-0.497618667632563f,
    	  				0.803738751805386f,
    	  				-0.297857795605605f,
    	  				-0.0992195435769564f,
    	  				0.0126039672622638f,
    	  				0.0322231006040782f};
     
    /************************************************
    * An efficient implementation of
    * the Fast Wavelet Transform using
    * Symmlet8 wavelets (FBI fingerprints standard)
    *************************************************/
    class FastSymmlet8 {
    	public:
     
    		static void transform (int,float *);
     
    		static void invTransform (int,float *);	
    		static void expand (int,float *);
     
    		class NotAPowerOf2Exception{};
    		class NotDivisibleBy2Exception{};
     
    		static void invTransform(int,float *, int);
    		static void transform(int,float *, int);
     
    	private:
     
    };
    void FastSymmlet8::transform(int length,float * v, int last) {
        float * ans=new float[last];
    	for(int k=0;k<last;k++) {
    		ans[k]=0;
    	}
        int half=last/2;
        for(int k=0;k<half-3;k++) {
              ans[k+half]=v[(2*k+0)]*wavelet[0]+v[(2*k+1)]*wavelet[1]+v[(2*k+2)]*wavelet[2]+v[(2*k+3)]*wavelet[3]+v[(2*k+4)]*wavelet[4]+v[(2*k+5)]*wavelet[5]+v[(2*k+6)]*wavelet[6]+v[(2*k+7)]*wavelet[7];
              ans[k]=v[(2*k+0)]*scale[0]+v[(2*k+1)]*scale[1]+v[(2*k+2)]*scale[2]+v[(2*k+3)]*scale[3]+v[(2*k+4)]*scale[4]+v[(2*k+5)]*scale[5]+v[(2*k+6)]*scale[6]+v[(2*k+7)]*scale[7];
    	}
        ans[last-3]=v[last-6]*wavelet[0]+v[last-5]*wavelet[1]+v[last-4]*wavelet[2]+v[last-3]*wavelet[3]+v[last-2]*wavelet[4]+v[last-1]*wavelet[5]+v[0]*wavelet[6]+v[1]*wavelet[7];
        ans[half-3]=v[last-6]*scale[0]+v[last-5]*scale[1]+v[last-4]*scale[2]+v[last-3]*scale[3]+v[last-2]*scale[4]+v[last-1]*scale[5]+v[0]*scale[6]+v[1]*scale[7];
        ans[last-2]=v[last-4]*wavelet[0]+v[last-3]*wavelet[1]+v[last-2]*wavelet[2]+v[last-1]*wavelet[3]+v[0]*wavelet[4]+v[1]*wavelet[5]+v[2]*wavelet[6]+v[3]*wavelet[7];
        ans[half-2]=v[last-4]*scale[0]+v[last-3]*scale[1]+v[last-2]*scale[2]+v[last-1]*scale[3]+v[0]*scale[4]+v[1]*scale[5]+v[2]*scale[6]+v[3]*scale[7];
        ans[last-1]=v[last-2]*wavelet[0]+v[last-1]*wavelet[1]+v[0]*wavelet[2]+v[1]*wavelet[3]+v[2]*wavelet[4]+v[3]*wavelet[5]+v[4]*wavelet[6]+v[5]*wavelet[7];
        ans[half-1]=v[last-2]*scale[0]+v[last-1]*scale[1]+v[0]*scale[2]+v[1]*scale[3]+v[2]*scale[4]+v[3]*scale[5]+v[4]*scale[6]+v[5]*scale[7];
    	for(int k=0;k<last;k++) {
    		v[k]=ans[k];
    	}
    	delete[] ans;
    }
     
    void FastSymmlet8::transform (int length,float * v) {
    	int last;
        for (last=length;last>8;last/=2) {
          transform(length,v,last);
        }
        if(last!=8) {
          cout<< "Attention : n'est pas une puissance de 2 : " << length << endl;
          cout<< "Careful : not a power of 2 : " << length << endl;
    	  throw NotAPowerOf2Exception();
    	}
    }
     
    void FastSymmlet8::invTransform(int length, float * v, int last) {
        int ResultingLength=2*last;
        float * ans=new float[ResultingLength];
    	for(int k=0;k<ResultingLength;k++) {
    		ans[k]=0;
    	}
        for(int k=0;2*k+7<ResultingLength;k++) {
              ans[(2*k+7)]+=scale[7]*v[k]+wavelet[7]*v[k+last] ;
              ans[(2*k+6)]+=scale[6]*v[k]+wavelet[6]*v[k+last] ;
              ans[(2*k+5)]+=scale[5]*v[k]+wavelet[5]*v[k+last] ;
              ans[(2*k+4)]+=scale[4]*v[k]+wavelet[4]*v[k+last] ;
              ans[(2*k+3)]+=scale[3]*v[k]+wavelet[3]*v[k+last] ;
              ans[(2*k+2)]+=scale[2]*v[k]+wavelet[2]*v[k+last] ;
              ans[(2*k+1)]+=scale[1]*v[k]+wavelet[1]*v[k+last] ;
              ans[(2*k+0)]+=scale[0]*v[k]+wavelet[0]*v[k+last] ;
        }
        ans[ResultingLength-6]+=scale[0]*v[last-3]+wavelet[0]*v[ResultingLength-3] ;
        ans[ResultingLength-5]+=scale[1]*v[last-3]+wavelet[1]*v[ResultingLength-3] ;
        ans[ResultingLength-4]+=scale[2]*v[last-3]+wavelet[2]*v[ResultingLength-3] ;
        ans[ResultingLength-3]+=scale[3]*v[last-3]+wavelet[3]*v[ResultingLength-3] ;
        ans[ResultingLength-2]+=scale[4]*v[last-3]+wavelet[4]*v[ResultingLength-3] ;
        ans[ResultingLength-1]+=scale[5]*v[last-3]+wavelet[5]*v[ResultingLength-3] ;
        ans[0]+=scale[6]*v[last-3]+wavelet[6]*v[ResultingLength-3] ;
        ans[1]+=scale[7]*v[last-3]+wavelet[7]*v[ResultingLength-3] ;
        ans[ResultingLength-4]+=scale[0]*v[last-2]+wavelet[0]*v[ResultingLength-2] ;
        ans[ResultingLength-3]+=scale[1]*v[last-2]+wavelet[1]*v[ResultingLength-2] ;
        ans[ResultingLength-2]+=scale[2]*v[last-2]+wavelet[2]*v[ResultingLength-2] ;
        ans[ResultingLength-1]+=scale[3]*v[last-2]+wavelet[3]*v[ResultingLength-2] ;
        ans[0]+=scale[4]*v[last-2]+wavelet[4]*v[ResultingLength-2] ;
        ans[1]+=scale[5]*v[last-2]+wavelet[5]*v[ResultingLength-2] ;
        ans[2]+=scale[6]*v[last-2]+wavelet[6]*v[ResultingLength-2] ;
        ans[3]+=scale[7]*v[last-2]+wavelet[7]*v[ResultingLength-2] ;
        ans[ResultingLength-2]+=scale[0]*v[last-1]+wavelet[0]*v[ResultingLength-1] ;
        ans[ResultingLength-1]+=scale[1]*v[last-1]+wavelet[1]*v[ResultingLength-1] ;
        ans[0]+=scale[2]*v[last-1]+wavelet[2]*v[ResultingLength-1] ;
        ans[1]+=scale[3]*v[last-1]+wavelet[3]*v[ResultingLength-1] ;
        ans[2]+=scale[4]*v[last-1]+wavelet[4]*v[ResultingLength-1] ;
        ans[3]+=scale[5]*v[last-1]+wavelet[5]*v[ResultingLength-1] ;
        ans[4]+=scale[6]*v[last-1]+wavelet[6]*v[ResultingLength-1] ;
        ans[5]+=scale[7]*v[last-1]+wavelet[7]*v[ResultingLength-1] ;
    	for(int k=0;k<ResultingLength;k++) {
    		v[k]=ans[k];
    	}
    	delete[] ans;
    }
     
    void FastSymmlet8::invTransform (int length,float * v) {
        int last;
        for (last=8;2*last<=length;last*=2) {
          invTransform(length, v,last);
        }
        if(last!=length) {
          cout << "Careful: not a power of 2 : " << length << endl;
          cout << "Attention : n'est pas une puissance de 2 : " << length << endl;
    	  throw NotAPowerOf2Exception();
    	}
     
    }
     
    void FastSymmlet8::expand(int length, float * v) {
     
    	int last=length/2;
    	int ResultingLength=2*last;
        float * ans=new float[ResultingLength];
    	for(int k=0;k<ResultingLength;k++) {
    		ans[k]=0;
    	}
        for(int k=0;2*k+7<ResultingLength;k++) {
              ans[(2*k+7)]+=scale[7]*v[k];
              ans[(2*k+6)]+=scale[6]*v[k];
              ans[(2*k+5)]+=scale[5]*v[k];
              ans[(2*k+4)]+=scale[4]*v[k];
              ans[(2*k+3)]+=scale[3]*v[k];
              ans[(2*k+2)]+=scale[2]*v[k];
              ans[(2*k+1)]+=scale[1]*v[k];
              ans[(2*k+0)]+=scale[0]*v[k];
        }
        ans[ResultingLength-6]+=scale[0]*v[last-3];
        ans[ResultingLength-5]+=scale[1]*v[last-3];
        ans[ResultingLength-4]+=scale[2]*v[last-3];
        ans[ResultingLength-3]+=scale[3]*v[last-3];
        ans[ResultingLength-2]+=scale[4]*v[last-3];
        ans[ResultingLength-1]+=scale[5]*v[last-3];
        ans[0]+=scale[6]*v[last-3];
        ans[1]+=scale[7]*v[last-3];
        ans[ResultingLength-4]+=scale[0]*v[last-2];
        ans[ResultingLength-3]+=scale[1]*v[last-2];
        ans[ResultingLength-2]+=scale[2]*v[last-2];
        ans[ResultingLength-1]+=scale[3]*v[last-2];
        ans[0]+=scale[4]*v[last-2];
        ans[1]+=scale[5]*v[last-2];
        ans[2]+=scale[6]*v[last-2];
        ans[3]+=scale[7]*v[last-2];
        ans[ResultingLength-2]+=scale[0]*v[last-1];
        ans[ResultingLength-1]+=scale[1]*v[last-1];
        ans[0]+=scale[2]*v[last-1];
        ans[1]+=scale[3]*v[last-1];
        ans[2]+=scale[4]*v[last-1];
        ans[3]+=scale[5]*v[last-1];
        ans[4]+=scale[6]*v[last-1];
        ans[5]+=scale[7]*v[last-1];
    	for(int k=0;k<length;k++) {
    		v[k]=ans[k];
    	}
    	delete[] ans;
    }
     
    /***************
    * Thanks to Peter Meerwald for pointing out a bug on the web release
    * of this code.
    ***************/
    int main () {
    	int length = 32;
    	float t[32]={1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f};
    	FastSymmlet8::transform(length,t);
    	FastSymmlet8::invTransform (length,t);
    	for(int k=0;k<length;k++) {
    		cout << t[k] << endl;
    	}
     
    }

Discussions similaires

  1. la compression JPEG2000
    Par sousou30 dans le forum Images
    Réponses: 2
    Dernier message: 22/12/2011, 10h14
  2. ID des formats dans le code Jpeg2000 de Jasper
    Par my_account dans le forum Jasper
    Réponses: 1
    Dernier message: 11/11/2011, 09h46
  3. [ImageIO] réduire la taille d'un JPEG2000
    Par Le Marlou dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/03/2010, 11h49
  4. quantification scalaire à zone morte (jpeg2000)
    Par oussama.cool dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 18/05/2009, 20h19

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