PIL イメージを配列に (NumPy 配列を配列に) - Python 質問する

PIL イメージを配列に (NumPy 配列を配列に) - Python 質問する

プレーンな Python 配列を処理する処理ルーチンを実装したので、.jpg イメージを Python 配列に変換したいと考えています。

PIL イメージは numpy 配列への変換をサポートしているようで、ドキュメントによると次のように記述しました。

from PIL import Image
im = Image.open("D:\Prototype\Bikesgray.jpg")
im.show()

print(list(np.asarray(im)))

これはnumpy配列のリストを返します。また、私は

list([list(x) for x in np.asarray(im)])

失敗しているため、何も返されません。

PIL から配列に、または単純に numpy 配列から Python 配列に変換するにはどうすればよいですか?

ベストアンサー1

tobytesオブジェクトのメソッドを使用することを強くお勧めしますImage。タイミングをいくつかチェックした後、これがはるかに効率的になります。

def jpg_image_to_array(image_path):
  """
  Loads JPEG image into 3D Numpy array of shape 
  (width, height, channels)
  """
  with Image.open(image_path) as image:         
    im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)
    im_arr = im_arr.reshape((image.size[1], image.size[0], 3))                                   
  return im_arr

私のノートパソコンで計測した時間を見ると

In [76]: %timeit np.fromstring(im.tobytes(), dtype=np.uint8)
1000 loops, best of 3: 230 µs per loop

In [77]: %timeit np.array(im.getdata(), dtype=np.uint8)
10 loops, best of 3: 114 ms per loop

おすすめ記事