我有两台安装了scipy 0.12和PIL的机器。在一台机器上,当我尝试读取.png文件时,它将返回一个大小为(wxhx 3)的整数数组:
In[2]: from scipy.ndimage.io import imread
In[3]: out = imread(png_file)
In[4]: out.shape
Out[4]: (750, 1000, 4)
在另一台机器上,使用相同的图像文件,这将返回PIL.PngImagePlugin.PngImageFile
包装在数组中的对象
In[2]: from scipy.ndimage.io import imread
In[3]: out = imread(png_file)
In[4]: out.shape
Out[4]: ()
In[5]: out
Out[5]: array(<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1000x750 at 0x1D40050>, dtype=object)
我看不到任何方法来访问后一个对象的数据。
我有一种模糊的感觉,那就是PIL使用Png库读取图像的方式出了问题,但是还有没有更具体的东西会出错并导致这种现象?
您可能安装了不完整的Python Imaging Library(PIL),SciPy依靠该库来读取图像。PIL依赖于libjpeg
软件包来加载JPEG图像,并依赖于zlib
软件包来加载PNG图像,但是可以不安装而安装(在这种情况下,它无法加载库缺少的任何图像)。
我遇到了与上述JPEG图像完全相同的问题。不会引发任何错误消息,但是SciPy调用仅返回包装的PIL对象,而不是将图像正确加载到数组中,这使得调试起来特别棘手。但是,当我尝试直接使用PIL加载图像时,得到了:
> import Image
> im = Image.open('001988.jpg')
> im
<JpegImagePlugin.JpegImageFile image mode=RGB size=333x500 at 0x20C8CB0>
> im.size
> (333, 500)
> pixels = im.load()
IOError: decoder jpeg not available
因此,我卸载了PIL的副本,安装了丢失的libjpeg
(对于我而言,可能zlib
是您的),重新安装了PIL以注册该库的存在,现在使用SciPy加载图像可以完美地工作:
> from scipy import ndimage
> im = ndimage.imread('001988.jpg')
> im.shape
(500, 333, 3)
> im
array([[[112, 89, 48], ...
..., dtype=uint8)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句