为什么这个PIL调用会崩溃Python?
import Image
from numpy import zeros, asarray
YUV = zeros((240, 320, 3), dtype='uint8')
im = Image.fromarray(YUV, mode="YCbCr")
blah = asarray(im)
当我运行这个(在 Py 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()
我开始在 blah 的大约第 180 行看到一些杂乱的内存。到底发生了什么?我是不是在从 PIL 图像转换为 numpy 数组时做错了?使用 array(im) 和 asarray(im) 有什么区别,哪个更好?(注意在前一种情况下,它有时仍然会崩溃,但似乎更稳定,杂乱的情况少一些)
(这里有一个 相关问题)
1 个回答
4
我注意到你的图片是YCbCr格式的3个通道,但你显示的是4个通道。原来这个“垃圾数据”的问题是因为PIL的数组接口里有个bug,而这个问题在2010年11月修复了。PIL的数组接口返回了一个额外的第4个通道。
我在PIL 1.1.7版本下运行了你的测试案例,确实看到了噪音。我把224
这个子图注释掉,然后用最新的PIL代码重新运行你的测试,这样就生成了一个正确的3个通道的数组,没有噪音。崩溃的问题可能也和这个有关,但我在我的环境中没能重现这个问题。