我有一个500x500阵列,我正在尝试编写一个名为“坐标”的变量,它将挑选出每个值,然后将其应用于函数,但我一直得到输出,
AttributeError Traceback (most recent call last)
/home/graham/<ipython-input-17-cc6ce0649eda> in <module>()
31 pass
32
---> 33 finished_array = rand_array_color(rand_array)
34
35 finished_image = Image.fromarray(finished_array)
/home/graham/<ipython-input-17-cc6ce0649eda> in rand_array_color(rand_array)
23 from PIL import Image
24 for ii in numpy.nditer(rand_array):
---> 25 coordinate = tuple(map(int, rand_image[ii,:]))
26 if ii < 128:
27 print "false"
/usr/lib/python2.7/dist-packages/PIL/Image.pyc in __getattr__(self, name)
510 new['data'] = self.tostring()
511 return new
--> 512 raise AttributeError(name)
513
514 ##
AttributeError: __getitem__
这是我的代码
from PIL import Image
from numpy import random
im = Image.open('/home/graham/Desktop/Experiment/gwarner/labeled_photos/photos/003030.png')
rand_array = numpy.random.randint(255, size=(500,500)).astype('uint8')
rand_image = Image.fromarray(rand_array)
def rand_array_color(rand_array):
from PIL import Image
for ii in numpy.nditer(rand_array):
coordinate = tuple(map(int, rand_image[ii,:]))
if ii < 128:
newvalue = rand_image.putpixel(coordinate(a,ii), im.getpixel(coordinate(a,ii)))
return newvalue
else:
pass
finished_array = rand_array_color(rand_array)
我也一直在摆弄另一个版本的坐标,
coordinate = tuple(int(rand_array[ii,0]),int(rand_array[ii,1])
但它只是返回,
NameError: name 'ii' is not defined
任何人都可以告诉我如何修复其中一个或推荐另一个有效吗?
答案 0 :(得分:0)
您无法使用ii
获取rand_image
rand_image[ii,:]
行的原因是因为rand_image
是PIL图像对象,并且没有相同的索引访问权限一个数组有。如果您想获得ii
行,则必须使用rand_array[ii]
(我不需要使用尾随冒号,:
)
这似乎与您的
类似另一版
coordinate
哪个应该有效,因为您使用的是数组而不是Image。我的猜测是你没有在与完全相同的地方取代它,可能在for ii in ...
循环之外的某个地方,因为ii
只能在coordinate
内正确定义那个循环。
正如您所定义的那样,coordinate(a, ii)
不是函数,它是长度为2的元组。但是当您编写coordinate
时,您将其称为函数。相反,您可能只想在那里使用a
(我不确定.putpixel
应该是什么。
函数newvalue = rand_image.putpixel(...)
不返回任何内容,因此当您说:
newvalue
None
将是rand_image.putpixel(...)
return rand_image
(python中的'空'对象)。也许你想这样做:
newvalue
未设置rand_image
并尝试将其返回,而是更改rand_image
中的像素并返回新的int()
。
作为旁注,你不应该在numpy数组上调用int
,相反,如果你想要数组中每个元素的类型为.astype
,你应该使用{{1如上所述,或者首先将其作为int
启动。一旦它以int
开头,它应该保持这种状态,除非你以某种方式投射它(你在这个脚本中没有这样做)。
最后需要注意的是,使用numpy(不使用纯python循环)可以更快地完成 lot ,但我不确定你要做什么。如果你编辑你的问题来解释一下你正在尝试做什么,以便我可以用一些上下文阅读代码,我可以提供帮助。例如,a
行中newvalue = ...
应该是什么?