5

このコードを実行しています

from PIL import Image
import numpy as np
im = Image.open("/Users/Hugo/green_leaves.jpg")
im.load()
height, widht = im.size
p = np.array([0,0,0])
for row in range(height):
     for col in range(widht):
         a = im.getpixel((row,col))
         p = np.append(a.asarray())

しかし、次のエラーが表示されます

Traceback (most recent call last):
   File "/Users/hugo/PycharmProjects/Meteo API/image.py", line 17, in <module>
     p = np.append(a.asarray())
 AttributeError: 'tuple' object has no attribute 'asarray'

私たちを手伝ってくれますか?

4

2 に答える 2

16

あなたは言及しnumpyました。画像のnumpy配列が必要な場合は、それを反復せずにdata = np.array(im).

例えば

from PIL import Image
import numpy as np
im = Image.open("/Users/Hugo/green_leaves.jpg")
p = np.array(im)

numpy 配列に繰り返し追加して構築することは、非常に非効率的です。Numpy 配列は Python リストとは異なります (Python リストはその目的に非常に役立ちます!!)。それらは、固定サイズで同種のメモリ効率の高い配列です。

追加によってnumpy配列を構築したい場合は、リスト(効率的に追加できる)を使用してから、そのリストをnumpy配列に変換します。

ただし、この場合、PIL イメージは numpy 配列への直接変換をサポートします。

もう 1 つ注意しておきたいのは、上記の例はあなたのコードと 100% 同等というわけではありません。 p元の例のように、numpixels by numbands 配列ではなく、numbands (3 または 4) 配列による高さ x 幅になります。

配列を numbands ごとに numpixels に再形成する場合は、次のようにします。

p = p.reshape(-1, p.shape[2])

(または同等に、p.shape = -1, p.shape[2])

これにより、配列width*heightが numbands (アルファ チャネルがあるかどうかに応じて 3 または 4) の配列に再形成されます。つまり、画像内の赤、緑、青、アルファのピクセル値のシーケンスです。これ-1は、指定された他のサイズに基づいて最初の軸の適切な形状を計算するよう numpy に指示するプレースホルダーです。

于 2014-02-19T16:02:57.190 に答える
2

リストとして初期化pし、for ループの後で numpy 配列に変換します。

p=[]
for row in range(height):
     for col in range(widht):
         a = im.getpixel((row,col))
         p.append(a)
p=np.asarray(p)

これにより、形状 (*, 3) のリストが作成されます。これは と同じnp.array(im).reshape(-1, 3)です。したがって、これが必要な場合は、後者の形式を使用してください ;)

于 2014-02-19T16:01:12.593 に答える