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." )