在Python中调整大图像大小的CPU效率最高的方法是什么

时间:2016-04-24 07:53:11

标签: python image python-imaging-library

我正在寻找调整图片大小的最有效方法。如果图像相对较小(例如3000x2000),PIL效果很好,但如果分辨率很大(16000x12000)则处理时间很长。图片不必看起来很漂亮我正在调整它们以进行比较,以便找到带有nrmse的图像副本。

from PIL import Image

img1 = Image.open("img1.jpg")
img2 = Image.open("img2.jpg")

print img1.size
print img2.size

# add width to height to see which resolution is bigger
im1s = img1.size[0] + img1.size[1]
im2s = img2.size[0] + img2.size[1]

# if both images are bigger than 3000 pixels make them smaller for comparison
if im1s > 3000 and im2s > 3000:
    print("Width and height of both images is bigger than 3000 pixels resizing them for easier comparison")
    im1_resize = img1.resize((640, 480), Image.ANTIALIAS)
    im2_resize = img2.resize((640, 480), Image.ANTIALIAS)

im1_resize.save('im1r.jpg')
im2_resize.save('im2r.jpg')

2 个答案:

答案 0 :(得分:0)

您应该在上采样时传递Image.NEAREST参数,即:

im1_resize = img1.resize((640, 480), Image.NEAREST)

这只会在上采样时采用最接近的像素,因此是最快的上采样方法。

使用ANTIALIAS时,会对多个像素进行采样以生成调整大小的图像,速度要慢得多。

请注意,您的瓶颈很可能是写出这些文件,而不是升级。

答案 1 :(得分:0)

我有两条建议。一个是libvips,另一个是jpegtran-cffi

由于我没有进行基准测试,所以我只记下每个库的要点。

Libvips支持大量图像格式,并通过智能决策获得速度,以允许多线程和使用快速cpu指令explained herebenchmarks。 python版本也是here

Jpegtran仅适用于jpegs。他们通过直接操作jpeg数据来获得速度,而无需重新压缩主readme中解释的最终输出以及基准。

我的猜测是,jpegtran是单线程的,当它可以在多处理环境中运行时,它会胜过libvip。我们唯一的比较是他们都比较的枕头基准。 Libvips的表现优于6倍,jpegtran可能优于2倍。