list と ndarray と Pillow画像データを行き来する

Python の標準の配列はリスト list です。これを numpy の ndarray 配列、Pillow の画像データ、を行き来する、つまり変換する方法を紹介します。

list から ndarray に変換する

mylist = list( range( 要素数 ))
arr = np.array( mylist ) を使って変換します.

ndarray から Pillow画像データに変換する

arr = np.zeros( 要素数 )
im = Image.fromarray( arr ) を使って変換します。

Pillow画像データから ndarray に変換する

im = Image.open( ファイルパス )
これも arr = np.array( im ) を使って変換します。

ndarray から list に変換する

arr = np.ones( 要素数 )
mylist = arr.tolist() を使って変換します。

変換のまとめのコード

すべてをまとめたのが下記のコードになります。

1次元のリストの場合は適宜 reshape で、2次元に変換したり、データの型 float だったら uint8 への変換を astype で実施したり、途中で細工してください。

from PIL import Image
import numpy as np

# Pythonのリスト(1次元)を要素数こみで宣言する.
w = 512
h = 256
list0 = list( range( w * h ) )

# リストにデータを仕込む.
for j in range( h ):
    for i in range( w ):
        list0[ i + w * j ] = i + j

# リストから ndarray を作成する.
arr0 = np.array( list0 )

# ndarray を2次元にする.
arr0 = arr0.reshape( h, w )

# ndarray を 0 ~ 255 に変換する.
arr0 = arr0.astype( np.uint8 )

# ndarray から Pillow へ変換する.
im0 = Image.fromarray( arr0 )

# Pillow で保存する.
im0.save( "c:/tmp/test00.bmp" )

# 同じファイルを Pillow で開く.
im1 = Image.open( "c:/tmp/test00.bmp" )

# Pillow から ndarray に変換する.
arr1 = np.array( im1 )

# ndarray を1次元にする.
arr1 = arr1.reshape(-1)

# ndarray からリストに変換する.
list1 = arr1.tolist()

# リストのデータは 0 ~ 255 なので反転する.
for n in range(len( list1 )):
    list1[n] = 255 - list1[n]
    
# リストから ndarray に変換する.
arr2 = np.array( list1 )

# ndarray を2次元にする、引数の順序に注意せよ.
arr2 = arr2.reshape(( im1.height ),( im1.width ))

# ndarray を 0 ~ 255 に変換する.
arr2 = arr2.astype( np.uint8 )

# ndarray を Pillow へ変換する.
im2 = Image.fromarray( arr2 )

# Pillow で保存する.
im2.save( "c:/tmp/test01.bmp" )

print( "finish." )