为什么这个PIL调用崩溃python?

时间:2011-03-24 00:28:00

标签: python arrays numpy python-imaging-library

import Image
from numpy import zeros, asarray
YUV = zeros((240, 320, 3), dtype='uint8')
im = Image.fromarray(YUV, mode="YCbCr")
blah = asarray(im)

当我运行它(Pyy 2.7.1上的IPython 0.10.1)时,似乎让python读取了一些它不应该读的内存。有时会崩溃,有时它不会崩溃,但我肯定可以通过将320x240零增加到3200x2400和/或调用blah.copy()来使其崩溃。另外,如果我这样做:

from matplotlib import pyplot as p
p.subplot(221); p.imshow(blah[:,:,0])
p.subplot(222); p.imshow(blah[:,:,1])
p.subplot(223); p.imshow(blah[:,:,2])
p.subplot(224); p.imshow(blah[:,:,3])
p.gray()
p.show()

我开始看到垃圾记忆在第180行左右出现。这里发生了什么?我是否以糟糕的方式从PIL Image转换为numpy数组?使用array(im)而不是asarray(im)有什么区别,什么是首选? (注意在前一种情况下,它有时仍然会崩溃,但它似乎更稳定,更少垃圾)

(这是一个related question

1 个答案:

答案 0 :(得分:4)

我注意到你的图像是YCbCr 3通道,但你显示的是4个通道。结果是“垃圾数据”问题是caused by a bug in PIL's array interface,修正是committed in Nov 2010。 PIL的阵列接口正在返回第4个通道。

我在PIL 1.1.7下运行了你的测试用例并看到了噪音。我注释了224子图并使用latest PIL trunk code重新运行了测试,并生成了一个合适的3通道阵列,没有噪声。崩溃也可能是相关的,但我无法在我的环境中重现它。