Accélérer programme

agouard31 -  
 agouard31 -
Bonjour,
Je souhaiterais accélérer ce programme permettant d'appliquer un effet "pop art" a une image.
En effet, le traitement est extrêmement long dès que l'image est assez grande (ex : tulipes de Windows)

Voici le programme :

from PIL import Image
path=input("veuillez entrer le chemin de l'image que vous souhaitez modifier")
im =Image.open(path)
im.show()
larg,haut=im.size
im2=Image.new("RGB",(larg,haut))
for x in range(larg):
    for y in range(haut):
        (r,v,b)=im.getpixel((x,y))
        im2.putpixel((x,y),(r,0,0))
        im2.save("im2.jpg")
 
im3=Image.new("RGB",(larg,haut))
for x in range(larg):
    for y in range(haut):
        (r,v,b)=im.getpixel((x,y))
        im3.putpixel((x,y),(0,v,0))
        im3.save("im3.jpg")
 
 
im4=Image.new("RGB",(larg,haut))
for x in range(larg):
    for y in range(haut):
        (r,v,b)=im.getpixel((x,y))
        im4.putpixel((x,y),(0,0,b))
        im4.save("im4.jpg")
 
 
im5=Image.new("RGB",(larg,haut))
for x in range(larg):
    for y in range(haut):
        (r,v,b)=im.getpixel((x,y))
        im5.putpixel((x,y),(r,v,0))
        im5.save("im5.jpg")
 
img_sortie=Image.new("RGB",(2*larg,2*haut))
for x in range(larg):
    for y in range(haut):
        img_sortie.putpixel((x,y),im2.getpixel((x,y)))
 
for x in range(larg):
    for y in range(haut):
        img_sortie.putpixel((x+larg,y),im3.getpixel((x,y)))
 
for x in range(larg):
    for y in range(haut):
        img_sortie.putpixel((x,y+haut),im4.getpixel((x,y)))
 
for x in range(larg):
    for y in range(haut):
        img_sortie.putpixel((x+larg,y+haut),im5.getpixel((x,y)))
 
img_sortie.show()

Comment faire ??? Merci beaucoup de votre d'aide ;)

2 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Alors là, comme code mal fichu, complètement inefficace, c'est champion
    • regroupe tes boucles concernant les différents plans
    • quel est l'intérêt de sauvegarder l'image sur disque à chaque appel de la méthode putpixel Réalises-tu ce que ce la représente, même pour une image de faible taille ?
    • idem pour la création de la sortie (pour laquelle tu ne fais même pas de copie en système de fichier ! un comble)


    Bref ceci sera plus efficace, quoi que plus gourmand en mémoire.
    from PIL import Image
    #path=input("veuillez entrer le chemin de l'image que vous souhaitez modifier")
    path="pink.jpeg"
    im =Image.open(path)
    im.show()
    larg,haut=im.size
    
    
    im2=Image.new("RGB",(larg,haut))
    im3=Image.new("RGB",(larg,haut))
    im4=Image.new("RGB",(larg,haut))
    im5=Image.new("RGB",(larg,haut))
    
    for x in range(larg):
        for y in range(haut):
            (r,v,b)=im.getpixel((x,y))
    
            im2.putpixel((x,y),(r,0,0))
            im3.putpixel((x,y),(0,v,0))        
            im4.putpixel((x,y),(0,0,b))
            im5.putpixel((x,y),(r,v,0))        
    
    img_sortie=Image.new("RGB",(2*larg,2*haut))
    for x in range(larg):
        for y in range(haut):
            img_sortie.putpixel((x,y),im2.getpixel((x,y)))
            img_sortie.putpixel((x+larg,y),im3.getpixel((x,y)))        
            img_sortie.putpixel((x,y+haut),im4.getpixel((x,y)))
            img_sortie.putpixel((x+larg,y+haut),im5.getpixel((x,y)))
    
    img_sortie.save("POPOART.jpeg")        
    img_sortie.show()


    Maintenant, quel est l'intérêt de créer les objets im2, ... , im5 dans la mesure où
    • un seul plan de couleur est significatf
    • tu n'effectues (je peux me tromper sur tes intentions !) aucn export de ces objets.

    DONC 3 tableaux suffiraient amplement et tu éviterais les appels à getpixel dans la seconde boucle. Je te laisse faire les modifications.

    Exemple:
    johand@bata:~/src/CCM/PYTHON/popart$ identify pink.jpeg
    pink.jpeg JPEG 425x272 425x272+0+0 8-bit sRGB 21.2KB 0.000u 0:00.000
    johand@bata:~/src/CCM/PYTHON/popart$ time python popart.py

    real 0m2.967s
    user 0m2.936s
    sys 0m0.024s


    Gates gave ^W sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    2
  2. agouard31
     
    Merci beaucoup pour votre reponse ! Je vais apporter les modifications nécessaires !
    0