首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么scipy.ndimage.io.imread返回的是PngImageFile,而不是一个值数组

为什么scipy.ndimage.io.imread返回的是PngImageFile,而不是一个值数组
EN

Stack Overflow用户
提问于 2013-09-26 18:49:24
回答 6查看 7.9K关注 0票数 8

我有两台不同的机器,分别安装了0.12和PIL。在一台机器上,当我试图读取一个.png文件时,它返回一个大小为(Wxhx3)的整数数组:

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
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库读取图像的方式有问题,但是是否有更具体的错误并导致这种行为呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-04 18:05:22

很可能您有一个不完整的(PIL)安装,SciPy依赖这个安装来读取图像。PIL依赖libjpeg包加载JPEG图像,zlib包加载PNG图像,但是可以在没有任何一种情况下安装(在这种情况下,它无法加载库中缺少的任何图像)。

我有完全相同的问题,您上面描述的JPEG图像。没有引发错误消息,但是SciPy调用只是返回一个包装的PIL对象,而不是正确地将图像加载到数组中,这使得调试变得特别困难。但是,当我尝试直接使用PIL加载映像时,我得到了:

代码语言:javascript
复制
> 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加载映像工作得很好:

代码语言:javascript
复制
> from scipy import ndimage
> im = ndimage.imread('001988.jpg')
> im.shape
   (500, 333, 3)
> im
   array([[[112, 89, 48], ...
                     ..., dtype=uint8)
票数 9
EN

Stack Overflow用户

发布于 2014-09-24 10:52:34

这个错误(imread返回一个PIL.PngImagePlugin.PngImageFile类而不是数据数组)经常发生在您安装了早期版本的python映像库pillow或更糟的是PIL时。pillow是一个更新的“友好”的PIL叉,绝对值得安装!

尝试更新这些包;(取决于您的python发行版)

代码语言:javascript
复制
# to uninstall PIL (if it's there, harmless if not)
$ pip uninstall PIL
# to install (or -U update) pillow
$ pip install -U pillow

然后尝试重新启动python并再次运行命令。

票数 5
EN

Stack Overflow用户

发布于 2016-05-03 06:53:01

对于大多数用例,我认为libjpeglibz依赖关系是最可能的原因,正如Ken的答案(接受的答案)中提到的那样。

我还想提一下,如果有人在tensorflow (特别是0.8.0)下经历过这种情况--我的意思是没有了tensorflow,PIL确实起了作用--那么类似的情况可能会因为tensorflow的缺陷而发生。

在github中报告的一些相关问题:

解决这一问题的方法是在import tensorflow as tf导入numpyscipyPIL之后移动语句numpy。如需详细处方,请参阅上述问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19036283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档