TypeError: putpixel() takes exactly 3 positional arguments (5 gi

Résolu/Fermé
yobe - 5 mars 2015 à 02:43
 yobe - 5 mars 2015 à 17:19
Bonjour,
J'ai un gros problème sur EduPython (2.5)
Je compose un programme pour faire un seuillage couleur sur une image. En voulant utiliser la fonction "im2.putpixel((x,y),p[0],p[1],p[2])" il me sort:"TypeError: putpixel() takes exactly 3 positional arguments (5 given) " ce que je ne comprends absolument pas.
Après plusieurs recherches et quelques bidouillages je n'ai toujours pas trouvé de solution, je me tourne donc vers vous !

Merci pour votre aide !


1 réponse

SypayV Messages postés 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 449
5 mars 2015 à 03:08
Salut,

http://effbot.org/imagingbook/image.htm

putpixel #

im.putpixel(xy, colour)

#Modifies the pixel at the given position. The colour is given as a single numerical value for single-band images, and a tuple for multi-band images.

#Note that this method is relatively slow. If you're using 1.1.6, pixel access objects (see load) provide a faster way to modify the image. If you want to generate an entire image, it can be more efficient to create a Python list and use putdata to copy it to the image. For more extensive changes, use paste or the ImageDraw module instead.

#You can speed putpixel up a bit by "inlining" the call to the internal putpixel implementation method:

    im.load()
    putpixel = im.im.putpixel
    for i in range(n):
       ...
       putpixel((x, y), value)

#In 1.1.6, the above is better written as:

    pix = im.load()
    for i in range(n):
        ...
        pix[x, y] = value


Et donc, tu devrais écrire :
im2.putpixel((x,y), (p[0],p[1],p[2]))

au lieu de
im2.putpixel((x,y), p[0],p[1],p[2])


0
Merci pour ta réponse, ça marche. Cependant lorsque je lance le programme et rentre un seuil, il me marque: "an entire required" et pourtant j'ai rentré un nombre entier. Je ne comprends pas.
0
SypayV Messages postés 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 449 > yobe
5 mars 2015 à 03:39
Il va nous falloir une copie entière de ton code et du message d'erreur exact, ainsi que le numéro de la ligne en question.

Je te conseil de copier ton code ici pour nous le communiquer : https://pastebin.com/
0
le voilà:
from PIL import Image
im1=Image.open("rouge1.jpg")
L,H=im1.size
im2 = Image.new ("RGB",(L,H))
S=int(input("Entrer un seuil de nuance de rouge: "))
for y in range(H):
for x in range(L):
p = im1.getpixel((x,y))
LUM=0,21*p[0]+0,71*p[1]+0,7*p[2]
if p[0]>p[1] and p[0]>p[2] and p[0]<S:
im2.putpixel((x,y), (LUM,LUM,LUM))
else:
im2.putpixel((x,y), (p[0],p[1],p[2]))
im2.save("image-seuillee.pgm")
im2.show()

Le message d'erreur est le suivant: "TypeError: an integer is required" et il n'y a aucun numéro de ligne.

Mais j'ai aussi ça dans la console: "Traceback (most recent call last):
File "C:\Users\Compaq\Desktop\seuillagecouleur2.py", line 12, in <module>
im2.putpixel((x,y), (LUM,LUM,LUM))
File "C:\Program Files (x86)\EduPython\App\lib\site-packages\PIL\Image.py", line 1274, in putpixel
return self.im.putpixel(xy, value)
TypeError: an integer is required "
0
SypayV Messages postés 6583 Date d'inscription vendredi 28 décembre 2007 Statut Contributeur Dernière intervention 19 février 2023 449 > yobe
Modifié par SypayV le 5/03/2015 à 17:10
Il s'agit de ta variable LUM.

LUM=0,21*p[0]+0,71*p[1]+0,7*p[2] 


Comme tu peux le voir, tu fais p multiplié par un nombre à virgule dans ton calcul. Donc LUM sera converti en nombre à virgule, ce qui est différent d'un nombre entier.

Ensuite, tu donnes LUM en argument à putpixel donc la bibliothèque va crasher au moment de retourner la valeur, lorsqu'il se rend compte que le type à retourner est différent de celui attendu.

Pour corriger ça, il faut convertir LUM en nombre entier.
Par exemple :
LUM=int(0,21*p[0]+0,71*p[1]+0,7*p[2])


Autre point à soulever, je ne sais pas si Python reconnaît la virgule ... mais dans le doute, utilise toujours des points au lieu des virgules.
Par exemple :
LUM=int(0.21*p[0]+0.71*p[1]+0.7*p[2])
0
C'est bon je viens de réussir avant de voir ta réponse, et c'est exactement ce que je viens de faire.
Merci pour ta réponse et tes conseils.
0