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)
縦横比が違っていても表示できたようです。