0

我有一个 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

谁能告诉我如何解决其中一个问题或推荐另一种可行的方法?

4

1 回答 1

0

您无法使用ii第 th 行的原因是因为它是一个 PIL Image 对象,并且没有数组所具有的相同索引访问。如果你想得到第 th 行,你必须使用(我已经省略了尾随冒号不是必需的)rand_imagerand_image[ii,:]rand_imageiirand_array[ii],:

这似乎与您的类似

另一个版本的coordinate

这应该可以工作,因为您使用的是数组而不是图像。我的猜测是,您没有在与第一个版本完全相同for ii in ...的位置替换它,可能在循环之外的某个地方,因为ii仅在该循环中正确定义。


正如您所定义的,它coordinate不是一个函数,它是一个长度为 2 的元组。但是当您编写coordinate(a, ii). 相反,您可能只想在coordinate那里使用(我不确定a应该是什么。


该函数.putpixel不返回任何内容,因此当您说:

newvalue = rand_image.putpixel(...)

newvalue将是None(python中的“空”对象)。也许你想这样做:

rand_image.putpixel(...)
return rand_image

不设置newvalue并尝试返回它,而是更改像素中的像素rand_image并返回新的rand_image.


作为旁注,您不应该调用int()numpy 数组,相反,如果您希望数组中每个元素的类型为int,您应该.astype像上面那样使用,或者int首先将其作为 an 启动。一旦它作为int.


最后一点,使用numpy (不使用纯 python 循环)可能会更快地完成此过程,但我不确定您到底要做什么。如果您编辑您的问题以解释您正在尝试做什么,以便我可以在某些上下文中阅读代码,我可以提供帮助。例如,a该行应该是什么newvalue = ...

于 2013-04-16T15:05:43.977 回答