我正在将一些基于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
(这些数字在多次运行中基本保持一致; 我不认为这是没有运行足够的测试的结果)
那么! 这是怎么回事?有没有办法加速 skimage 的 rotate
?
版本信息:
- PIL: 1.1.7
- skimage: 0.14.1
- numpy: 1.7.1
- Python: 2.7.2
还值得注意的是:
- 如果不使用
BICUBIC
滤波,则im.rotate
操作仅需要大约0.01秒,而设置order=0
以使用最近邻滤波,则skimage.rotate
需要大约0.6秒。