Accélérer programme

Fermé
agouard31 - Modifié par KX le 22/11/2015 à 13:25
 agouard31 - 22 nov. 2015 à 15:50
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

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 22/11/2015 à 15:32
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
Merci beaucoup pour votre reponse ! Je vais apporter les modifications nécessaires !
0