8

我有两台安装了 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 库读取图像的方式有问题,但是是否有更具体的错误并导致这种行为?

4

6 回答 6

9

您可能安装了不完整的 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)
于 2013-11-04T18:05:22.663 回答
5

这个错误(imread返回一个PIL.PngImagePlugin.PngImageFile类而不是一个数据数组)经常发生在你有旧版本的 python 图像库pillow或更糟糕的仍然PIL安装时。pillow是一个更新的“友好”分支,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 并再次运行命令。

于 2014-09-24T10:52:34.773 回答
1

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

我还想提一下,如果有人在tensorflow(尤其是 0.8.0)下遇到这种情况——我的意思是没有 tensorflow,PIL 确实有效——那么由于 tensorflow 的错误可能会发生类似的情况。

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

对此的解决方法是import tensorflow as tf导入,或. 详细处方请参考上述问题。numpyscipyPIL

于 2016-05-03T06:53:01.793 回答
1

这些解决方案都不适合我。即使在安装zliband之后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'))

返回所需的数据数组。

于 2019-08-14T21:03:03.307 回答
1

以上都没有为我解决这个问题。

我要做的是:Pillow从降级5.4.05.3.0

于 2019-01-04T22:25:57.370 回答
0

尝试这个 :

In[2]: from scipy.ndimage.io import imread
In[3]: imread("/hsgs/projects/awagner/test_image.png").shape

告诉我出了什么问题?

于 2013-09-26T19:03:21.940 回答