この記事の内容
- imread関数の速さを比較します。
追記(2020.2.26)
- pillowのImage.openがやたらと速いのはそもそもの処理が違うからということについて、こちらをどうぞ。
imreadとは?
画像データを読み込む際に使われる関数ですが、いろいろなモジュールに同じ名前で組み込まれています。
以下では、scipy、matplotlib、opencv、imageio、pillowで画像をロードし、その速さを比較します。
pillow(PIL)はimreadではないですが、比較してみます。
比較方法
- Corei7 (I7-7567U)で処理します。
- レナさんをロードします。
- 下のようにして1, 10, 100, 1000, 10000回読み込みます。
- 各読み込み回数ごとに10回試行し、平均を取ります。
load_lena.py
import sys
import time
import statistics
import scipy.misc as misc
import matplotlib.pyplot as plt
import cv2
import imageio
from PIL import Image
def load_imread(how):
if how == "scipy":
imread = misc.imread
elif how == "plt":
imread = plt.imread
elif how == "cv2":
imread = cv2.imread
elif how == "imageio":
imread = imageio.imread
elif how == "PIL":
imread = Image.open
return imread
def load_img(path, imread):
for i in range(10000):
imread(path)
if __name__ == '__main__':
times = []
imread = load_imread(sys.argv[2])
for i in range(10):
t = time.time()
load_img(sys.argv[1], imread)
times.append(time.time() - t)
print(statistics.mean(times))
compare.sh
python load_lena.py lena_std.tif scipy
python load_lena.py lena_std.tif plt
python load_lena.py lena_std.tif cv2
python load_lena.py lena_std.tif imageio
python load_lena.py lena_std.tif PIL
結果
module | 1 | 10 | 100 | 1000 | 10000 |
---|---|---|---|---|---|
scipy | 1.7604 | 10.1680 | 105.7542 | 1106.6721 | 9590.0972 |
plt | 1.8986 | 9.5794 | 101.2807 | 1060.2709 | 9070.2802 |
cv2 | 1.0150 | 8.7479 | 90.4795 | 1048.3251 | 9753.4891 |
imageio | 1.8104 | 9.4085 | 69.5722 | 764.6874 | 7153.4754 |
PIL | 0.8072 | 4.1412 | 28.9652 | 301.9217 | 2709.1016 |
(いずれもミリセカンド)
1回のみ読み込む際のopencvの速さと、全体を通して安定して早いPILが目立ちますね。また、10000回単位で読み込む際にはimageioかPILを使うのが良さそうです。
ちなみに
- scipy, plt, cv2, imageioはnumpy配列で読み込まれますが、PILだけはPILイメージとして読み込まれ、numpy配列にするには変換する必要があります。
- scipy.miscのimreadは、deprecatedのため1.2.0で削除されます。代わりにimageioを使うことをおすすめされていますね。