我有两台不同的机器,安装了scipy 0.12和PIL。在一台机器上,当我尝试读取.png文件时,它返回一个大小为(w x h x 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库读取图像的方式有问题,但是有哪些更具体的错误会导致这种行为吗?
答案 0 :(得分:8)
您可能安装了不完整的Python图像库(PIL),SciPy依赖它来读取图像。 PIL依赖于libjpeg
加载JPEG图像和libz
来加载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
(在我的情况下,可能是你的libz
),重新安装PIL以注册库的存在,现在用SciPy加载图像完美运作:
> from scipy import ndimage
> im = ndimage.imread('001988.jpg')
> im.shape
(500, 333, 3)
> im
array([[[112, 89, 48], ...
..., dtype=uint8)
答案 1 :(得分:5)
当您拥有较旧版本的python映像库imread
或更糟糕的PIL.PngImagePlugin.PngImageFile
时,通常会发生此错误(pillow
返回PIL
类而非数据数组)安装。 pillow
是一个更新的友好&#34; PIL
的分叉,绝对值得安装!
尝试更新这些包; (取决于你的python发行版)
# to uninstall PIL (if it's there, harmless if not)
$ pip uninstall PIL
# to install (or -U update) pillow
$ pip install -U pillow
然后尝试重新启动python shell并再次运行命令。
答案 2 :(得分:1)
对于大多数用例,我认为libjpeg
或libz
依赖是最可能的原因,正如Ken Chatfield的回答(接受的那个)中提到的那样。
我还想提一下,如果有人在 tensorflow (尤其是0.8.0)下遇到这种情况---我的意思是没有张量流,PIL确实有效 - 那么类似的情况可能会由于张量流的错误而发生。
github报道了一些相关问题:
对此的解决方法是在导入import tensorflow as tf
,numpy
或scipy
之后移动PIL
声明。有关详细处方,请参阅上述问题。
答案 3 :(得分:1)
以上都不为我解决了这个问题。
我要做的是:
将Pillow
从5.4.0
降级到5.3.0
答案 4 :(得分:0)
试试这个:
In[2]: from scipy.ndimage.io import imread
In[3]: imread("/hsgs/projects/awagner/test_image.png").shape
并告诉我什么是出来的?
答案 5 :(得分:0)
这些解决方案都不对我有用;即使安装了zlib
和libjpeg
之后,
from PIL import Image
image = Image.open('2007_000032.png')
print(type(image))
是
<class 'PIL.PngImagePlugin.PngImageFile'>
但是, 只需调用:
import numpy as np
image = np.asarray(Image.open('2007_000032.png'))
返回所需的数据数组。