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