Pythonで画像を読み込む方法

Pythonで画像を読み込む方法をご紹介します。

本記事では、有名な画像処理ライブラリである、PillowとOpenCVを取り上げます。

条件

  • Python 3.7.0
  • Pillow 6.0.0
  • opencv-python 4.1.0.25

画像読み込み

以下の画像を読み込みます。

画像読み込み後、50×50にリサイズして配列化します。

PIL(Pillow)の場合

インストール

pip install Pillow

ソース

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt


FILE_PATH = 'C:/tmp/dog.jpg'
IMG_SIZE = 50

# 画像ファイルパスから読み込み
img = Image.open(FILE_PATH)
img = img.convert("RGB")
img = img.resize((IMG_SIZE, IMG_SIZE))  # リサイズ

# 画像の表示
plt.imshow(img)
plt.show()

# データ確認
print("データ:", img)
img_array = np.asarray(img)
print("配列:", img_array)

実行結果

データ: <PIL.Image.Image image mode=RGB size=50x50 at 0x29684A38CC0>
配列: [[[ 54  73  80]
  [ 50  73  79]
  [ 56  70  79]
  ...
  [ 58  81  97]
  [ 59  81  95]
  [ 61  80  97]]

 [[ 53  71  81]
  [ 51  74  82]
  [ 54  72  84]
  ...
  [ 62  81  98]
  [ 59  82 100]
  [ 59  82  98]]

 [[ 55  73  85]
  [ 56  74  88]
  [ 57  73  86]
  ...
  [ 59  82  98]
  [ 65  84 101]
  [ 62  84  98]]

 ...

 [[101 122 149]
  [108 129 148]
  [157 148 141]
  ...
  [140 108  93]
  [142 116 103]
  [153 119 109]]

 [[113 128 149]
  [134 138 149]
  [174 154 143]
  ...
  [139 103  89]
  [137 108  90]
  [148 119 105]]

 [[110 131 150]
  [131 134 149]
  [180 158 144]
  ...
  [133 100  83]
  [136 105  87]
  [134 101  86]]]

OpenCVの場合

インストール

pip install opencv-python

ソース

NumPy配列(ndarray)として読み込まれるところが、PILとは異なります。
(PILの場合、img_array = np.asarray(img) のように明示的に変換する必要があります。)

import matplotlib.pyplot as plt
import cv2


FILE_PATH = 'C:/tmp/dog.jpg'
IMG_SIZE = 50

# 画像ファイルパスから読み込み
img = cv2.imread(FILE_PATH)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGRからRGBへ変換
img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))  # リサイズ

# 画像の表示
plt.imshow(img)
plt.show()

# データ確認
print("配列:", img)

実行結果

PIL(Pillow)とは若干異なりますが、ほとんど同じ結果です。

配列: [[[ 52  72  81]
  [ 49  72  80]
  [ 54  70  82]
  ...
  [ 60  80  98]
  [ 58  81  96]
  [ 59  81  97]]

 [[ 53  71  81]
  [ 53  73  84]
  [ 54  72  83]
  ...
  [ 61  81  98]
  [ 58  82 100]
  [ 58  81  99]]

 [[ 55  73  85]
  [ 56  74  87]
  [ 58  73  86]
  ...
  [ 59  82  99]
  [ 64  84 101]
  [ 62  83  99]]

 ...

 [[101 122 148]
  [110 129 148]
  [163 152 145]
  ...
  [140 106  92]
  [143 115 102]
  [153 119 109]]

 [[109 126 148]
  [137 139 147]
  [184 159 144]
  ...
  [137 103  88]
  [138 107  92]
  [148 119 107]]

 [[110 131 150]
  [127 135 149]
  [186 162 148]
  ...
  [136 101  86]
  [135 103  87]
  [133  99  86]]]

処理速度

処理速度は、OpenCV > PIL です。

大量の画像を扱う場合、OpenCVを用いた方が良さそうです。

詳細は以下のサイトをご確認ください。

https://www.kaggle.com/vfdev5/pil-vs-opencv/notebook

参考

Qiita:Pythonの画像読み込み: PIL, OpenCV, scikit-image

https://qiita.com/wasnot/items/be649f289073fb96513b

kaggle:Fast benchmark: Pillow vs OpenCV

https://www.kaggle.com/vfdev5/pil-vs-opencv/notebook

Pythonで画像を読み込む方法” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です