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

9

我正在寻找最有效的图像调整大小方法。如果图像相对较小(例如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')

1
最高效的方式是在GPU上进行此操作。但我猜这不是你想要的答案。 - tobspr
我建议你在谷歌上搜索“vips”,或者甚至在这里在SO上搜索 - 它非常适合大型图像。 - Mark Setchell
2个回答

8

在放大图片时,应该传递Image.NEAREST参数,例如:

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

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

使用ANTIALIAS时,会对多个像素进行采样以生成调整大小后的图像,这种方法速度较慢。

请注意,最有可能成为瓶颈的是文件的写出,而不是上采样。


它更快了,但仍然不够快。还有其他选择吗?我尝试过裁剪,但它所需的时间几乎与调整大小相同。 - Gunnm
正如所说,最大的问题可能是写出文件。尝试测量调整大小所需的时间以及写入磁盘所需的时间。 - tobspr
我正在使文件变小而不是变大。图像调整大小需要6.5秒,保存只需要0.1秒,毕竟它只是一个640x480的文件。 - Gunnm
啊,那我没仔细读。那么加载图片呢?需要多长时间? - tobspr
图像加载时间为0.007秒。 - Gunnm

3
我有两个推荐。一个是libvips,另一个是jpegtran-cffi
由于我没有进行基准测试,我只写下每个库的要点。
Libvips支持大量的图像格式,并通过智能决策允许多线程和使用快速CPU指令在这里解释基准测试来提高速度。此外,Python版本在这里
Jpegtran仅适用于JPEG。他们直接在JPEG数据上操作而无需重新压缩最终输出,在主要的自述文件中解释并附带基准测试。
我的猜测是,jpegtran是单线程的,当它在多进程环境中运行时会比libvip表现更好。我们唯一的比较是与它们都进行比较的pillow基准测试。Libvips的性能优于它6倍,而jpegtran可能只有2倍的优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接