プレーンな 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