16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

画像読み込み速度比較

Last updated at Posted at 2018-12-14

この記事の内容

  • 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

(いずれもミリセカンド)

imread.png
1回のみ読み込む際のopencvの速さと、全体を通して安定して早いPILが目立ちますね。また、10000回単位で読み込む際にはimageioかPILを使うのが良さそうです。

ちなみに

  • scipy, plt, cv2, imageioはnumpy配列で読み込まれますが、PILだけはPILイメージとして読み込まれ、numpy配列にするには変換する必要があります。
  • scipy.miscのimreadは、deprecatedのため1.2.0で削除されます。代わりにimageioを使うことをおすすめされていますね。
16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?