4

だから私はプロットしたい曲線のx値とy値をnumpy配列のfloat値として保持しています。ここで、それらを最も近いintに丸めて、空のPILイメージにピクセル値としてプロットします。xベクトルとyベクトルを実際に埋める方法を除いて、これが私たちが取り組んでいるものです:

# create blank image    
new_img = Image.new('L', (500,500))    
pix = new_img.load()

# round to int and convert to int    
xx = np.rint(x).astype(int)    
yy = np.rint(y).astype(int)

ordered_pairs = set(zip(xx, yy))

for i in ordered_pairs:    
    pix[i[0], i[1]] = 255  

これにより、エラーメッセージが表示されます。

  File "makeCurves.py", line 105, in makeCurve
    pix[i[0], i[1]] = 255        
TypeError: an integer is required

ただし、.astype(int)これらの子犬を整数にキャストする必要があるため、これは私には意味がありません。私が使用すればpix[int(i[0]], int(i[1])]それは機能しますが、それはひどいです。

.astype(int)PILによってintとして認識されないのはなぜですか?

4

2 に答える 2

3

問題は、numpy配列にタイプなどがあることだと思います。これは、PILが画像へのインデックス作成に使用できるものnumpy.int64として理解していません。int

numpy.int64これを試してください。これにより、すべてのがPythonに変換されますint

# round to int and convert to int    
xx = map(int, np.rint(x).astype(int)) 
yy = map(int, np.rint(y).astype(int))

私がこれをどのように理解したのか疑問に思われるかもしれませんが、私typeはnumpy配列の値に対して関数を使用しました:

>>> a = np.array([[1.3, 403.2], [1.0, 0.3]])
>>> b = np.rint(a).astype(int)
>>> b.dtype
 dtype('int64')
>>> type(b[0, 0])
 numpy.int64
>>> type(int(b[0, 0]))
 int
于 2012-10-22T23:27:05.030 に答える
2

コードの最初の部分で何をしているのかわかりませんが、代わりにこれを使用してpix = new_img.load()を置き換えてみませんか?

# create blank image    
new_img = Image.new('L', (500,500))

pix = array(new_img) # create an array with 500 rows and 500 columns

そして、あなたはあなたの元のコードに従うことができます:

# round to int and convert to int    
xx = np.rint(x).astype(int)    
yy = np.rint(y).astype(int)

ordered_pairs = set(zip(xx, yy))

for i in ordered_pairs:    
    pix[i[0], i[1]] = 255 

Out[23]: 
array([[  0,   0,   0, ...,   0,   0,   0],
       [  0, 255,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0,   0,   0],
       ..., 
       [  0,   0,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0,   0,   0],
       [  0,   0,   0, ...,   0,   0,   0]], dtype=uint8)
于 2012-10-22T23:17:43.630 に答える