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

usingのiith 行を取得できない理由は、 が PIL Image オブジェクトであり、配列と同じインデックス アクセスがないためです。番目の行を取得したい場合は、使用する必要があります(末尾のコロンは省略しました) 。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(...)

newvalueNone(Python の「空の」オブジェクト) になります。おそらくあなたはこれをしたいでしょう:

rand_image.putpixel(...)
return rand_image

を設定しnewvalueて返そうとせずに、代わりに のピクセルを変更しrand_imageて新しい を返しrand_imageます。


int()補足として、配列内の各要素のタイプを にしたい場合は、numpy 配列を呼び出すべきではありません。代わりに、上記のようにint使用するか、最初.astypeに として開始する必要があります。intとして開始すると、int何らかの方法でキャストしない限り、そのままの状態を維持する必要があります (このスクリプトでは行っていません)。


最後の注意として、このプロセスはおそらくnumpyを使用して(純粋なpythonループを使用せずに)はるかに高速に実行できますが、何をしようとしているのか正確にはわかりません. 質問を編集して、何をしようとしているのかを少し説明して、コンテキストでコードを読むことができるようにしてください。たとえばa、ラインには何が入っているはずnewvalue = ...ですか?

于 2013-04-16T15:05:43.977 に答える