2017-01-05 7 views
0

Я начинаю работать с Python и Image Processing и пытаюсь изменить значения пикселей изображения с помощью следующей функции. Однако я получаю сообщение об ошибке: ТипError: объект instancemethod не поддерживает назначение объектов на 12-й (последней, но одной) строке кода Есть ли все-таки разобраться? Это мой код:PIL TypeError: объект instancemethod не поддерживает назначение объектов

from PIL import Image 
import math 
size=width,height=32,32 
img=Image.new("L", size, "white") 
pix=img.load 
for i in range (0,31): 
    for j in range (0,31): 
     sqsum=i*i+j*j 
     sqrt=math.sqrt(sqsum) 
     sine=math.sin(sqrt) 
     absval=abs(sine) 
     pix[i,j]=absval 
img.show() 
+4

Потому что вы не вызывали 'img.load' перед циклом. Должно быть 'pix = img.load()'. –

+0

Спасибо! Я изменил его, и теперь код работает нормально. –

ответ

0

В Python методы объекта сами по себе являются также объекты - в instancemethod объект. Это означает, что отказ от () при назначении не приводит к ошибке, он просто не делает того, что вы ожидали от него. Это довольно распространенная опечатка.

pix=img.load() 
#   ^^ 

Для отладки проблемы, как это, просто спросите себя: «Почему pixinstancemethod?» и отступать оттуда назад. Он приводит вас непосредственно к заданию присваивания, в котором возникла проблема.

+0

Спасибо! Я изменил его, и теперь он работает нормально. –

+0

У меня все еще есть проблема. Когда я пытаюсь напечатать absval, он печатает правильные десятичные значения, но после назначения их pix [i, j] (в последней, но одной строке кода), когда я пытаюсь распечатать pix [i, j], он печатает из всех нулей. Я не смог понять, как правильно это сделать. –

+0

@VenkateshSeetha в режиме 'L', каждый пиксель является * целым числом * между 0 и 255. Вам нужно масштабировать свои номера до этого диапазона. –