Python中实现图像旋转的最快方法是什么?
Python图像旋转性能对比实测
我需要了解Python中旋转图像的最快方法。
据我搜索Stack Overflow上暂无相关问题及解答,因此我决定开展实验探明答案,在此将结果分享给大家:
首先导入实验用到的依赖库:
# 对比2D图像旋转的不同实现速度 # 主流的图像操作库有以下4种: # PIL # OpenCV # SciPy # skimage import numpy as np import PIL import cv2 import matplotlib.pylab as plt from PIL import Image from scipy.ndimage import rotate from scipy.ndimage import interpolation import scipy from skimage.transform import rotate # 读取测试数据 PIL_image = Image.open('cat.jpg') # image = cv2.imread('bambi.jpg') # 灰度读取示例 array_image = np.array(PIL_image)
各库旋转函数封装
def rotate_PIL (image, angel, interpolation): # 可选插值方式:PIL.Image.NEAREST(最近邻)、PIL.Image.BILINEAR(2×2区域线性插值)、PIL.Image.BICUBIC return image.rotate(angel,interpolation) def rotate_CV(image, angel , interpolation): # OpenCV需要手动构造变换矩阵应用仿射变换 # 可选插值方式:cv2.INTER_CUBIC(速度较慢)、cv2.INTER_LINEAR h,w = image.shape[:2] cX,cY = (w//2,h//2) M = cv2.getRotationMatrix2D((cX,cY),angel,1) rotated = cv2.warpAffine(image,M , (w,h),flags=interpolation) return rotated def rotate_scipy(image, angel , interpolation): return scipy.ndimage.interpolation.rotate(image,angel,reshape=False,order=interpolation)
JPEG格式图像测试
使用timeit测试三个库的旋转速度:
%timeit rotate_PIL(PIL_image,20,PIL.Image.NEAREST) %timeit rotate_CV(array_image,20,cv2.INTER_LINEAR) %timeit rotate_scipy(array_image,20,0)
测试结果:
975 µs ± 203 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 3.5 ms ± 634 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 36.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
JPEG场景下PIL性能远超另外两个库。
大尺寸TIFF格式图像测试
上述结果仅针对JPEG格式图像,我日常主要处理TIFF格式的大型原始图像,因此追加了TIFF格式测试:
# TIFF图像测试 # 读取测试数据 PIL_image = Image.open('TiffImage.tif') # image = cv2.imread('bambi.jpg') # 灰度读取示例 array_image = np.array(PIL_image) %timeit rotate_PIL(PIL_image,20,PIL.Image.NEAREST) %timeit rotate_CV(array_image,20,cv2.INTER_LINEAR) %timeit rotate_scipy(array_image,20,0)
测试结果:
65.1 ms ± 9.35 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 38.6 ms ± 6.91 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 344 ms ± 43.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
TIFF格式场景下,OpenCV的表现优于JPEG场景下的最优选择PIL。
如果有人了解该性能差异的原因,或是有同类实验结果,欢迎在此分享,我认为这会是一份很有价值的公开对比资料。如果您认为本实验存在不合理之处或有改进方向,也欢迎告知。
内容的提问来源于stack exchange,提问作者shahab daiani
相关产品推荐
相关产品推荐

