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
pip install 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)
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)
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]]]
データ: <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]]]
データ: <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
pip install opencv-python
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)
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)
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]]]
配列: [[[ 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]]]
配列: [[[ 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で画像を読み込む方法” に対して2件のコメントがあります。