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

Calcul scientifique Python Discussion :

Problème pywt - PIL (double/entiers)


Sujet :

Calcul scientifique Python

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Problème pywt - PIL (double/entiers)
    Bonsoir,
    J'utilise la lib PIL pour ouvrir et enregistrer des JPEG.
    J'utilise aussi Pywt pour faire le transformée en ondelettes discrète.
    Le truc, et c'est mon problème, c'est que je sais convertir chaque composante (R,G,B) de mon image, et je souhaite recréer une image réduite de moitié par les ondelettes.
    Malheureusement, cette dernière étape ne fonctionne pas, je pense que c'est dû au fait que la fonction pywt.dwt() me renvoie une liste (à priori) de double, et qu'il me faut des int.

    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
     
    R,G,B=im.split();
     
    R=list(R.getdata());
    G=list(G.getdata());
    B=list(B.getdata());
     
    (RA,RD)=pywt.dwt(R,'db2','sp1')
    (GA,GD)=pywt.dwt(G,'db2','sp1')
    (BA,BD)=pywt.dwt(B,'db2','sp1')
     
    #C'est normal, la suite, je réagrandi avec erreur
     
    RA=pywt.idwt(RA, None, 'db2', 'sp1')
    GA=pywt.idwt(GA, None, 'db2', 'sp1')
    BA=pywt.idwt(BA, None, 'db2', 'sp1')
     
    comp=(RA,GA,BA) # ICI, ça ne passe plus
    imgnew = Image.merge('RGB',comp)
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Voilà un code complet (copier-collé du tien) qui m'a l'air de fonctionner. J'ai pris lena.jpg ( http://images.google.fr/images?hl=fr...pg&sa=N&tab=wi ) en couleur de taille 512 par 512.
    La fonction merge demande en argument un tuple d'images, toi, tu fournissais un couple de listes.
    Enfin, au final, j'ai une image qui resemble à la première mais un peu compressé 35 ko contre 67 ko au départ

    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
     
    import pywt
    import Image
    im = Image.open('lena.jpg')
    R,G,B=im.split();
    R=list(R.getdata());
    G=list(G.getdata());
    B=list(B.getdata());
    (RA,RD)=pywt.dwt(R,'db2','sp1')
    (GA,GD)=pywt.dwt(G,'db2','sp1')
    (BA,BD)=pywt.dwt(B,'db2','sp1')
     
    RA=pywt.idwt(RA, None, 'db2', 'sp1')
    GA=pywt.idwt(GA, None, 'db2', 'sp1')
    BA=pywt.idwt(BA, None, 'db2', 'sp1')
     
    comp=(RA,GA,BA) # ICI, ca ne passe plus
    comp = (map(int,comp[0]), map(int,comp[1]), map(int,comp[2]))
    c1 = Image.new('L', (512, 512))
    c2 = Image.new('L', (512, 512))
    c3 = Image.new('L', (512, 512))
    c1.putdata(comp[0])
    c2.putdata(comp[1])
    c3.putdata(comp[2])
    imgnew = Image.merge('RGB',(c1,c2,c3))
    imgnew.save('toto.jpg')

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, j'ai corrigé mon code en conséquence .
    Merci !
    Sinon, il est possible de faire la différence de deux images ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    oui dans le module ImageChops ( http://python.developpez.com/cours/p...imagechops.php )
    y'a la fonction difference ou substract (en fonction de ce que tu cherches)

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Si je veux créer une image deux fois plus grande que mon image originale (ça, je pense savoir), et mettre en haut à gauche mon image originale, je fais comment ?
    J'ai vu la méthode Image.box mais pas sûr qu'elle m'aide...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Non, c'est la fonction paste

    <H3>paste

    im.paste(image, box)
    Pastes another image into this image. The box argument is either a 2-tuple giving the upper left corner, a 4-tuple defining the left, upper, right, and lower pixel coordinate, or None (same as (0, 0)). If a 4-tuple is given, the size of the pasted image must match the size of the region.
    If the modes don't match, the pasted image is converted to the mode of this image (see the convert method for details).
    im.paste(colour, box)
    Same as above, but fills the region with a single colour. The colour is given as a single numerical value for single-band images, and a tuple for multi-band images.
    im.paste(image, box, mask)
    Same as above, but updates only the regions indicated by the mask. You can use either "1", "L" or "RGBA" images (in the latter case, the alpha band is used as mask). Where the mask is 255, the given image is copied as is. Where the mask is 0, the current value is preserved. Intermediate values can be used for transparency effects.
    Note that if you paste an "RGBA" image, the alpha band is ignored. You can work around this by using the same image as both source image and mask.
    im.paste(colour, box, mask)
    Same as above, but fills the region indicated by the mask with a single colour.
    </H3>

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Mmh, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    width,height=im.size
    im_big = Image.new('RGB', (width*2, height*2))
    im_big.paste(im,None)
    Mais il me met :
    im_big.paste(im,None)
    File "C:\Python24\Lib\site-packages\PIL\Image.py", line 1013, in paste
    self.im.paste(im, box)
    ValueError: images do not match
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  8. #8
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Voilà un exemple qui marche:

    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
     
    import Image
    im1 = Image.open('lena.jpg') ## lena.jpg image 512x512 couleur
     
    size = []
    size.append(2 * im1.size[0])
    size.append(2 * im1.size[1])
    im = Image.new('RGB',size)
    size1 = (0,0)
    size2 = (im1.size[0], 0)
    size3 = (0, im1.size[1])
    size4 = im1.size
    im.paste(im1, size1)
    im.paste(im1, size2)
    im.paste(im1, size3)
    im.paste(im1, size4)
    im.save('toto.jpg')
    ton image im est un en RGB ?

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Effectivement, ça fonctionne mieux .

    Merci beaucoup !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  10. #10
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ca aurait été trop beau .
    J'ai ce 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
     
    import Image,ImageChops
    import pywt
    import psyco
     
    psyco.full()
    im1 = Image.open("lena.jpg");
     
    size = []
    size.append(2 * im1.size[0])
    size.append(2 * im1.size[1])
    im = Image.new('RGB',size)
    size1 = (0,0)
    im.paste(im1, size1)
    R,G,B=im1.split();
    R=list(R.getdata());
    G=list(G.getdata());
    B=list(B.getdata());
     
    RA=pywt.idwt(R, None, 'db2', 'sp1')
    GA=pywt.idwt(G, None, 'db2', 'sp1')
    BA=pywt.idwt(B, None, 'db2', 'sp1')
     
    comp=(RA,GA,BA)
    comp = (map(int,comp[0]), map(int,comp[1]), map(int,comp[2]))
    c1 = Image.new('L', size)
    c2 = Image.new('L', size)
    c3 = Image.new('L', size)
    c1.putdata(comp[0])
    c2.putdata(comp[1])
    c3.putdata(comp[2])
    imgnew = Image.merge('RGB',(c1,c2,c3))
    imgnew.save('big_lena.jpg')
    En théorie, il m'agrandit l'image de base par deux, en pratique, ce n'est pas le cas.

    Modifié le code...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  11. #11
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    moi ton prog me donne ceci (image en piece jointe)
    Images attachées Images attachées  

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je l'ai modifié, j'ai réedité.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  13. #13
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Le problème vient de idwt :

    j'obtiens:
    len(R) = 262144
    len(RA) = 512288 (alors que tu voudrais 1024576)
    Mais je ne connais pas iwdt. Donc il faut que tu regardes de ce côté.

    Sinon, pourquoi utilisez les ondelettes ?

    la fonction resize marche très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    im2 = im1.resize((1024,1024))

  14. #14
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je vais voir avec pywt.
    Pourquoi les ondelettes ?
    Pour apprendre, car je trouve ça puissant .
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  15. #15
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Est-il possible d'obtenir les images RGB sous une forme matricielle ?
    Pour pouvoir utiliser ces fonctions :
    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
    import numpy
     
    def dwt2(data, wavelet, mode):
       data = numpy.asarray(data, dtype=numpy.float64)
       if len(data.shape) != 2:
           raise ValueError("Expected 2D array")
       wavelet = pywt.Wavelet(wavelet)
     
       H, L = [], []
       for row in data:
           cA, cD = pywt.dwt(row, wavelet, mode)
           L.append(cA)
           H.append(cD)
     
       H = numpy.transpose(H)
       L = numpy.transpose(L)
     
       LL, LH = [], []
       for row in L:
           cA, cD = pywt.dwt(row, wavelet, mode)
           LL.append(cA)
           LH.append(cD)
     
       HL, HH = [], []
       for row in H:
           cA, cD = pywt.dwt(row, wavelet, mode)
           HL.append(cA)
           HH.append(cD)
     
       return map(numpy.array, [LL, LH, HL, HH])
     
    def idwt2(LL, LH, HL, HH, wavelet, mode):
       #do the dimension and checking here
     
       L = []
       for rowL, rowH in zip(LL, LH):
           L.append(pywt.idwt(rowL, rowH, wavelet, mode))
     
       H = []
       for rowL, rowH in zip(HL, HH):
           H.append(pywt.idwt(rowL, rowH, wavelet, mode))
     
       L = numpy.transpose(L)
       H = numpy.transpose(H)
     
       data = []
       for rowL, rowH in zip(L, H):
           data.append(pywt.idwt(rowL, rowH, wavelet, mode))
     
       return numpy.array(data, dtype=numpy.float64)
    Maintenant, pour pouvoir m'en servir, il me faut un tableau colonnes/lignes.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  16. #16
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    salut! Euh je ne suis pas ur de repondre a ta question.Tu peux mettre une image sous forme matricielle a l'aide de la fonction setshape().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import numarray # a essayer avec numpy
     
     
    data=im.getdata()
    larg,haut=im.size
    Matrice1D=N.array(data)
    Matrice2D=Matrice.setshape(larg,haut)
    Apres ca marche si tu a un seul composante.
    Je pense que tu peux créer une hyper matrice avec trois argument pour setshape.

    Voila!
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  17. #17
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je suis désolé de reprendre ce sujet qui est vieux, mais je le reprends aujourd'hui .
    parp1: ton code fonctionne normallement ?
    Car N n'est pas connu, et je suppose que c'est Matrice1D.setshape() et non Matrice.setshape() ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  18. #18
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut Dslé
    Oula le post qu'on soir de derriere les fagots les longues soirée d'hiver.... lol

    Enfait j'ai fait une petit erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import numarray as N# a essayer avec numpy
     
     
    data=im.getdata()
    larg,haut=im.size
    Matrice1D=N.array(data)
    Matrice2D=Matrice1.setshape(larg,haut)
    Ca devrait fonctionner... A plus Camarade!
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

Discussions similaires

  1. [MySQL] Problème avec un double quote
    Par wormseric dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2007, 14h44
  2. [mysql5]problème truncated incorrect double value xx
    Par moulefrite dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/11/2006, 17h17
  3. [MySQL] Problème avec une double insertion
    Par warmup27 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 20/10/2006, 23h36
  4. Problème de relation double
    Par Rub-n dans le forum Access
    Réponses: 1
    Dernier message: 31/05/2006, 18h07
  5. Problème d'éxécution: double free or corruption
    Par ciol_tebroc dans le forum C++
    Réponses: 3
    Dernier message: 17/05/2006, 19h44

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