6

私はいくつかの PIL ベースのコードを NumPy に変換しようとしていますが、このskimage.transform.rotate関数はPIL の よりも大幅に遅いことがわかりましたImage.rotate

大まかな比較として、skimage~1000x1000 ピクセルの画像で の回転を使用すると ~2.2 秒Image.rotateかかり、 ~0.1 秒かかります。

import time
from PIL import Image
import numpy as np
from skimage.transform import rotate

im = Image.open("some_big_image.png").convert("L")
print "Image size: %s" %(im.size, )

s = time.time()
im.rotate(10, Image.BICUBIC, expand=True)
print "Image.rotate: %0.04f" %(time.time() - s, )

ima = np.array(im) / 255.0
s = time.time()
rotate(ima, 10, order=3) # order=3 --> bi-cubic filtering
print "skimage.transform.rotate: %0.04f" %(time.time() - s, )

そして出力:

$ py rotate.py
Image size: (1275, 1650)
Image.rotate: 0.1154
skimage.transform.rotate: 2.2310

(これらの数値は、複数の実行にわたって多かれ少なかれ一貫しています。これが十分なテストを実行していないためのアーティファクトだとは思いません)

そう!どうしたの?スキイメージを高速化する方法はありますrotateか?

バージョン情報:

  • PIL: 1.1.7
  • スキーイメージ: 0.14.1
  • でこぼこ: 1.7.1
  • パイソン: 2.7.2

また、注目に値する場合があります。

  • BICUBICフィルタリングを使用しない場合、im.rotate操作にかかる時間はわずか 0.01 秒ですが、order=0最近傍フィルタリングを使用するように設定するとskimage.rotate0.6 秒かかります。
4

2 に答える 2

7

https://github.com/scikit-image/scikit-imageから最新バージョンをインストールします。ほんの数日前、このスローダウンに関連するバグを修正しました ( https://github.com/scikit-image/scikit-image/commit/d5776656a8217e58cb28d5760439a54e96d15316を参照)。

私の番号は、現在の開発バージョンでは次のとおりです。

from PIL import Image
import numpy as np
from skimage.transform import rotate

a = np.zeros((1000, 1000), dtype=np.uint8)

im = Image.fromarray(a)

%timeit im.rotate(10, Image.BICUBIC, expand=True)

ima = a / 255.0
%timeit rotate(ima, 10, order=1)
%timeit rotate(ima, 10, order=3)


## -- Output --
10 loops, best of 3: 41.3 ms per loop
10 loops, best of 3: 43.6 ms per loop
10 loops, best of 3: 101 ms per loop
于 2013-11-11T21:57:54.553 に答える