[Google Colab] 複数の画像をタイル状に並べてサムネイルの様に表示したい


Google Colaboratory で画像系の処理を行う際、複数の画像を表示して比較したいときがあります。単純にループの中で一枚一枚表示させると縦にスペースを使いスクロールが大変なので、なるべく横に並べてスペースを有効活用したい。

確認はしてませんが、Jupyter Lab/Notebookでも動作するかもです。

Numpy.ndarrayとして読み込んだ画像の一括表示

必要パケージのインポート(コピペ用)

import matplotlib.pyplot as plt

関数として定義(コピペ用)

def show_images(images, figsize=(20,10), columns = 5):
  plt.figure(figsize=figsize)
  for i, image in enumerate(images):
      plt.subplot(len(images) / columns + 1, columns, i + 1)
      plt.imshow(image)

画像読み込み例

今回は、Kerasを利用して読み込めるCIFAR-100のデータセットを利用します。

from keras.datasets import cifar100

(x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')
images = x_train[:10]

呼び出し例

show_images(images)

show_images(x_train[:100], figsize=(10,15), columns = 10)

パラメータは多少調整が必要ですね。

Googleドライブやアップロードした画像ファイルの一括表示

Googleドライブをマウント

ファイルを直接Colabにアップロードした場合はこのステップは不要です。

from google.colab import drive
MOUNT_DIR = '/content/drive' #マウントする場所を指定
drive.mount(MOUNT_DIR)

実行すると、Go to this URL in a browser: にリンクが表示されるのでこれを開き、マウントするGoogleDriveのあるアカウントを選択肢し、アクセスを許可すると、コードが表示されます。

このコードを Enter your authorization code: に入力します。

ls /content/drive/MyDrive/PATH_TO_IMAGE_DIRECTORY/

中身を確認します。
※ PATH_TO_IMAGE_DIRECTORYはGoogleDrive上のパスです。

必要パケージのインポート(コピペ用)

import cv2
from glob import glob
import matplotlib.pyplot as plt
import os

関数として定義(コピペ用)

def show_images_glob(images, figsize=(20,10), columns = 5):
  plt.figure(figsize=figsize)
  for i, image in enumerate(images):
      plt.subplot(len(images) / columns + 1, columns, i + 1)
      plt.imshow(cv2.imread(image))

ファイル読み込み例

SOURCE_IMAGES = "/content/drive/MyDrive/PATH_TO_IMAGE_DIRECTORY"
FILE_PATTERN = "*.jpeg" #ワイルドカードでフィルタリング
images = glob(os.path.join(SOURCE_IMAGES, FILE_PATTERN))

SOURCE_IMAGES には画像が存在するColab上のディレクトリパスを指定
FILE_PATTERN はワイルドカードですべてのjpeg画像を指定しています。

呼び出し例

show_images_glob(images)

縦横比が違っていても表示できたようです。

参考