globを使った複数画像の読み込み

前回記事では単一の画像を表示する方法を3種類紹介しました。

今回はその発展で複数の画像、例えばフォルダ内保存している数枚の画像を一度に取り扱う方法を紹介します。
連番画像を読み込む手法とglobを用いる手法を記しています。

開発環境はjupyter notebook、言語はpythonです。

本プログラムはgoogle driveにも保存しておりますので、必要に応じてお使いください。

今回作成したコード

#1:モジュールのインポート
import glob
import matplotlib.pyplot as plt
import cv2
from mpl_toolkits.axes_grid1 import ImageGrid
%matplotlib inline

#2:連番画像の読み込み
fig = plt.figure(1, (12., 12.))
grid = ImageGrid(fig, 111,
                 nrows_ncols=(1,2),
                 axes_pad=0.1)
for i in range(0,2):
    img = cv2.imread("ramen"+str(i)+".jpg")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
    grid[i].imshow(img) 
plt.imshow(img)

#3:globによる読み込み
fig = plt.figure(1, (12., 12.))
grid = ImageGrid(fig, 111,
                 nrows_ncols=(1,2),
                 axes_pad=0.1)
files = glob.glob("*.jpg")
for n in range(len(files)):
    img = cv2.imread(files[n])
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
    grid[n].imshow(img) 
plt.imshow(img)
なお本プログラムと同フォルダ内にramen0.jpgとramen1.jpgという2枚の画像を保存しています(下図参照)。

folder/
┣ipynbファイル
┣ramen0.jpg
┗ramen1.jpg



プログラムの解説

1.モジュールのインポート

#1:モジュールのインポート
import glob
import matplotlib.pyplot as plt
import cv2
from mpl_toolkits.axes_grid1 import ImageGrid
%matplotlib inline
今回新たにglobというモジュールをインポートしています。
globはファイルのパス名を自動取得するのに便利なので覚えておきましょう。

2.連番画像の読み込み

#2:連番画像の読み込み
fig = plt.figure(1, (12., 12.))
grid = ImageGrid(fig, 111,
                 nrows_ncols=(1,2),
                 axes_pad=0.1)
for i in range(0,2):
    img = cv2.imread("ramen"+str(i)+".jpg")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
    grid[i].imshow(img) 
plt.imshow(img)
今回のように画像が1, 2, 3, ・・・と連番で並んでいる場合、for文を使うことで複数の画像を順番に読み込むことができます。
ここでfor文によって指定される変数iは数値型の文字であるため、str()関数を用いて文字型に変換しています。
ただ、わざわざ連番の画像を用意するのも手間なので、次項に示すglobを用いる手法の方がおすすめです。
ちなみに変数figとgridは画像をjupyter notebook上で見やすく表示するためのコマンドだと思ってください。後日紹介します。

3.globによる読み込み

#3:globによる読み込み
fig = plt.figure(1, (12., 12.))
grid = ImageGrid(fig, 111,
                 nrows_ncols=(1,2),
                 axes_pad=0.1)
files = glob.glob("*.jpg")
for n in range(len(files)):
    img = cv2.imread(files[n])
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
    grid[n].imshow(img) 
plt.imshow(img)
複数の画像を読み込む際にはこちらの方法がおすすめです!
glob.glob("パス")と入力するだけで指定のフォルダ内にあるファイル一覧を取得することができます。

今回は"*.jpg"と記述することでipynbと同じフォルダに保存されたjpgファイルをすべて読み込んでいます。

globを使ってパスを取得する場合は、50音順に取り出されるので、files[0]にはramen0.jpg、files[1]にはramen1.jpgのパスが格納されています。

※*は情報処理の世界でワイルドカードとも呼びます。言葉で説明するのは難しいので、ぜひググって調べてください。
プログラムを実行すると画像のように表示されます。
plt.imshow()の結果

以上より、1つのフォルダに入れた複数の画像を、一気に処理できるようになりました。
これで無作為に命名された画像であっても、同じフォルダに保存するだけで同時に処理できるようになります。

今回使用した画像①:スパイス・ラー麺卍力

ramen0.jpgの方です。カレーのようにスパイスの効いたラーメンが病みつきになります。



今回使用した画像②:秋葉原ラーメン 天神屋

ramen1.jpgの方です。高野豆腐を混ぜ込んだ特製麺など、こだわりの強いラーメン屋。

コメント