Pythonで1つのファイルから複数の画像を表示する方法
PythonのNumPyモジュールを使って、1つのファイルに複数の画像を保存し、そのファイルを使って複数の画像を表示するプログラムを紹介します。
この投稿のプログラムで使っている画像は、ぱくたそさんの画像を使っています。
目次
・1枚の画像を1つのファイルに保存
・1つのファイルから1枚の画像を表示
・複数の画像を1つのファイルに保存
・1つのファイルから複数の画像を表示
・参考サイト
1枚の画像を1つのファイルに保存
1 2 3 4 5 6 7 8 |
import matplotlib.pyplot as plt import numpy as np #画像の読み込み img=plt.imread("np_pic/cat1.jpg") #保存 np.savez("py_pic1.npz",d1=img) |
読み込んだ画像をNumPyのsavez関数を使って、ファイルに保存しています。
plt.imread()で画像をNumPy配列(ndarray)にして読み込んでいるから、savez関数で画像の保存ができる。
保存した様子

1つのファイルから1枚の画像を表示
1 2 3 4 5 6 7 8 9 10 11 12 |
import matplotlib.pyplot as plt import numpy as np #ファイルの読み込み data=np.load("py_pic1.npz") #画像データの取り出し img=data["d1"] #表示 plt.imshow(img) plt.show() |
NumPyのload関数を使って、ファイルを読み込みます。
読み込んだデータを取り出すときは保存するときに使った引数の名前を使って取り出します。
保存するときの引数に“d1”という名前を使ったので、data[“d1”]のようにして取り出します。
表示した様子

複数の画像を1つのファイルに保存
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 |
import matplotlib.pyplot as plt import numpy as np import glob import cv2 #フォルダから画像データを取り出す pic_data=glob.glob("np_pic/*.jpg") img_list=[] #複数画像の高さと幅の平均を求める h=0 w=0 for i in pic_data: img=plt.imread(i) h+=len(img)#高さの合計を求める w+=len(img[0])#幅の合計を求める h_avg=h//len(pic_data)#高さの平均を求める w_avg=w//len(pic_data)#幅の平均を求める for i in range(len(pic_data)): img=plt.imread(pic_data[i])#読み込み img = cv2.resize(img,(w_avg, h_avg)) # サイズを統一しないといけない、保存はできるが読み込んで表示するときにエラーがでる img_list.append(img)#画像データをリストに追加 #保存 np.savez("py_pic5.npz",d1=img_list) |
複数の画像を保存する方法は、リストに画像データを1つずつ追加してから、そのリストをNumPy配列に変換し、savez関数を使って1つのファイルに保存します。
複数の画像を保存する場合は、画像サイズの高さと幅を揃えて保存しないといけないです。
11行目から18行目で画像の高さと幅の平均の大きさを求めています。
そして、22行目のcv2.resizeを使って、サイズを揃えています。
サイズを揃えないで保存することはできるのですが、ファイルからデータを取り出すときにエラーがでます。
このプログラムで使うフォルダの中身

保存した様子

1つのファイルから複数の画像を表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import matplotlib.pyplot as plt import numpy as np #ファイルの読み込み data = np.load("py_pic5.npz") #画像データの取り出し img_data=data['d1'] #表示 for i in range(len(img_data)): plt.subplot(3, 2, i+1) plt.imshow(img_data[i]) plt.show() |
Matplotlibモジュールのsubplot関数を使って複数の画像を1回で表示しています。
表示した様子

1枚ずつ表示したい場合は12行目から15行目を消して、下のプログラムを挿入すれば1枚ずつ表示できます。
1 2 |
plt.imshow(img_data[i]) plt.show() |
参考サイト
NumPyを使ったファイルの保存について紹介されています。