pythonを使った機械学習でよく出てくる画像読み込み/描画処理


画像の読み込み

以下のようにディレクトリ内の画像ファイルパスを配列で読み込んでおいて使うことが多い。

# globで対象ファイルパスを読み込み、sortedで並び替えている
train_images_path_list = sorted(glob('./input/train_images/*.jpg'))

画像の読み込みにはだいたいPillowかOpenCVが使われる。
読み込み後はPillowは独自形式、OpenCVはnumpy.ndarray型になる。
numpyによってPillowの独自形式の型もnumpy.ndarray型に変換可能。

import cv2

image = cv2.imread(train_images_path_list[0])
print(type(image))
# => numpy.ndarray

from PIL import Image
import numpy as np

image = Image.open(train_images_path_list[0])
print(type(image))
# => (jpeg形式のファイルの場合)PIL.JpegImagePlugin.JpegImageFile
print(type(np.array(image)))
# => numpy.ndarray

画像の表示

画像の描画はだいたいmatplotlib.pyplotが使われる。
Pillow独自形式もnumpy.ndarray型もどちらもimshowで描画できる。ただし、色の取り扱いが異なるので注意が必要。

Pillowを使う場合

import matplotlib.pyplot as plt
from PIL import Image

image = Image.open(train_images_path_list[0])

plt.imshow(image)

OpenCVを使う場合

OpenCVは色の取り扱いに注意が必要。
numpy.ndarray型は1階層目:幅、2階層目:高さ、3階層目:色として値が格納されている。
注意すべきは3階層目の色でOpenCVはBGR、PillowはRGBの順で値を格納しており、
matplotlib.pyplotはRGBとして色を認識するので、OpenCVで読み込んだ場合は色の変換が必要になる。

import matplotlib.pyplot as plt
import cv2

image = cv2.imread(train_images_path_list[0])
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)

複数枚表示

複数枚表示したい場合は以下のようにsubplotsメソッドでaxesを生成し、各axesのimshowにnumpy.ndarray(もしくはpillow独自型)を渡す。

from PIL import Image
import matplotlib.pyplot as plt

# 3*3 =9枚の画像を描画したい場合
ROWS = 3
COLS = 3
fig, axes = plt.subplots(nrows=ROWS, ncols=COLS, figsize=(15, 10))
for row in range(ROWS):
  for col in range(COLS):
    file = train_images_path_list[(row * COLS) + col]
    image = Image.open(file)
    axes[row][col].imshow(image)
    axes[row][col].set_title(file)

plt.show()