Accélérer programme
agouard31
-
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 :
Comment faire ??? Merci beaucoup de votre d'aide ;)
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
-
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) -