0

简短的问题

使用 Python 图像库时,是否open()立即解压图像文件?

细节

我想测量压缩图像(jpeg,png ...)的解压缩时间,因为我读到它应该是图像“复杂性”的一个很好的衡量标准(空白图像将被快速解压缩,a纯随机图像,因为它根本不会被压缩,所以最“有趣”的图像应该具有最长的解压缩时间)。所以我写了下面的python程序:

# complexity.py
from PIL import Image
from cStringIO import StringIO
import time
import sys

def mesure_complexity(image_path, iterations = 10000):
    with open(image_path, "rb") as f:
        data = f.read()
    data_io = StringIO(data)

    t1 = time.time()
    for i in xrange(iterations):
        data_io.seek(0)
        Image.open(data_io, "r")
    t2 = time.time()
    return t2 - t1

def main():
    for filepath in sys.argv[1:]:
        print filepath, mesure_complexity(filepath)

if __name__ == '__main__':
    main()

它可以这样使用:

#python complexity.py blank.jpg blackandwhitelogo.jpg trees.jpg random.jpg
blank.jpg 1.66653203964
blackandwhitelogo.jpg 1.33399987221
trees.jpg 1.62251782417
random.jpg 0.967066049576

如您所见,我根本没有得到预期的结果,尤其是对于空白.jpg 文件:它应该是“复杂性”最低(解压缩时间最快)的文件。所以要么我读的文章是完全错误的(我真的怀疑它,这是一篇严肃的科学文章),要么 PIL 没有做我认为它正在做的事情。也许在实际需要时,实际转换为位图是懒惰的?但是,为什么open延迟会有所不同呢?最小的jpg文件当然是空白图片,最大的是随机图片。这真的没有意义。

注1:多次运行程序时,我得到大致相同的结果:结果很荒谬,但很稳定。;-)

注 2:所有图像的尺寸相同(宽 x 高)。

编辑

我只是尝试使用 png 图像而不是 jpeg,现在一切都按预期运行。凉爽的!我刚刚按复杂程度对大约 50 张图像进行了排序,它们看起来确实越来越“复杂”。我查看了这篇文章(顺便说一句,这是 Jean-Paul Delahaye 在“Pour la Science”中的一篇文章,2013 年 4 月):作者实际上提到他只使用了无损压缩算法。所以我想答案是open 确实解压缩了图像,但是我的程序没有工作,因为我应该只使用用无损算法压缩的图像(png,而不是 jpeg)。

4

1 回答 1

1

很高兴你把它整理好了。无论如何,该open()方法确实是一个惰性操作——如文档中所述,为了确保图像将被加载,请使用image.load(),因为这实际上会强制 PIL / Pillow 解释图像数据(在链接文档中也有说明) .

于 2013-05-29T12:38:34.597 回答