画像データからnumpy形式に変換する方法
画像認識など画像を用いた判定を行う場合、jpgなどの画像データを読み込みますが、それらの画像データはnumpy配列の形式に変更する必要があります。その方法を知らないと画像データを取り込んだものの、学習や評価できないということになってしまいます。
今回はjpgなどの画像データを読みこんだあとにnumpyの配列の形式に変更する方法について説明します。
前提条件
ソースコードを実行するPythonファイルと同一の階層にディレクトリを作成し、その中に画像を格納します。拡張性を高めるためディレクトリは複数(Folder1,Folder2)とします。読み込まれた画像は50×50のRGB形式にリサイズしてnumpyの配列に格納されます。
ディレクトリ構成
・Pythonのソースコード(.py形式)
・Folder1(フォルダ)
→jpg型式の画像ファイル(複数枚可能)
・Foledr2(フォルダ)
→jpg型式の画像ファイル(複数枚可能)
ソースコード
ソースコードです。詳細は別途説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from PIL import Image import os, glob import numpy as np folder = ["folder1","folder2"] image_size = 50 X = [] Y = [] for index, name in enumerate(folder): dir = "./" + name files = glob.glob(dir + "/*.jpg") for i, file in enumerate(files): image = Image.open(file) image = image.convert("RGB") image = image.resize((image_size, image_size)) data = np.asarray(image) X.append(data) Y.append(index) X = np.array(X) Y = np.array(Y) |
ソースコードの詳細
1 2 3 |
import os, glob from PIL import Image import numpy as np |
1 2 3 4 5 |
folder = ["folder1","folder2"] image_size = 50 X = [] Y = [] |
1 2 3 4 5 6 7 8 9 10 11 |
for index, name in enumerate(folder): dir = "./" + name files = glob.glob(dir + "/*.jpg") for i, file in enumerate(files): image = Image.open(file)http://newtechnologylifestyle.net/wp-admin/post-new.php# image = image.convert("RGB") image = image.resize((image_size, image_size)) data = np.asarray(image) X.append(data) Y.append(index) |
1 2 |
X = np.array(X) Y = np.array(Y) |
numpy配列の形式に変更しています。
実行結果
folder1に3枚の画像データ、folder2に3枚の画像データを格納し実際に実行してみます。
1 |
len(X) |
1 |
6 |
6と出力されており6枚の画像データが取り込まれています。
1 |
X[0][0] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
array([[189, 193, 205], [207, 211, 223], [238, 244, 255], [226, 239, 255], [224, 244, 255], [217, 242, 255], [228, 251, 255], [217, 247, 249], [224, 246, 255], [236, 240, 255], [226, 245, 252], [219, 252, 255], [248, 241, 231], [249, 205, 178], [212, 171, 143], [205, 158, 130], [220, 177, 160], [174, 134, 126], [112, 77, 71], [113, 82, 77], [119, 90, 86], [ 74, 46, 43], [ 70, 41, 37], [ 84, 65, 61], [ 52, 42, 40], [ 49, 39, 40], [ 75, 60, 63], [ 61, 42, 44], [ 77, 57, 59], [ 66, 44, 46], [ 45, 31, 22], [ 60, 43, 36], [116, 86, 84], [ 93, 58, 39], [ 83, 56, 27], [241, 231, 239], [215, 218, 249], [209, 218, 225], [208, 206, 211], [207, 197, 231], [160, 194, 232], [169, 202, 235], [174, 194, 231], [182, 204, 241], [219, 236, 254], [240, 248, 255], [193, 208, 227], [181, 198, 224], [227, 235, 255], [217, 223, 237]], dtype=uint8) |
1枚目の画像データの[0]番目です。50×50のため50個のデータがRBG形式[Red,Green,Blue]で格納されています。
1 |
X[0][49] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
array([[244, 233, 239], [243, 238, 244], [244, 242, 247], [244, 242, 247], [255, 253, 255], [251, 245, 245], [255, 255, 253], [255, 251, 231], [134, 86, 76], [237, 193, 158], [131, 97, 88], [ 81, 52, 38], [ 63, 38, 31], [113, 80, 63], [ 77, 43, 44], [144, 100, 87], [239, 221, 211], [137, 82, 77], [141, 79, 64], [125, 69, 52], [150, 112, 89], [174, 109, 87], [176, 120, 95], [181, 123, 99], [182, 124, 100], [165, 107, 85], [152, 97, 76], [135, 84, 63], [153, 105, 85], [156, 110, 87], [ 77, 54, 36], [ 54, 34, 23], [100, 59, 55], [ 98, 68, 58], [ 79, 49, 41], [ 51, 40, 38], [ 41, 25, 25], [ 96, 71, 64], [145, 106, 91], [175, 130, 111], [210, 172, 161], [228, 195, 188], [233, 202, 197], [228, 195, 188], [235, 202, 197], [241, 239, 242], [188, 193, 215], [194, 215, 236], [230, 232, 245], [185, 184, 190]], dtype=uint8) |
1枚目の画像データの[49]番目です。50×50のため50個のデータがRBG形式[Red,Green,Blue]で格納されています。
1 |
len(Y) |
1 |
6 |
6と出力されており6枚の画像データが取り込まれています。
1 |
Y |
1 |
array([0, 0, 0, 1, 1, 1]) |
Yにはフォルダの識別子です。folder1の場合は0、folder2の場合は1が格納されています。