numpy.asarray( Image.open ( ...) ) 无法正常工作
我觉得使用numpy.asarray是创建图像的numpy数组的推荐方法。
numpy.asarray(Image.open("cat.jpg"))
我电脑上有两个python安装。一个是我自己在家目录里安装的,另一个是在/usr目录下安装的。
不过,家目录里的那个安装不太好用。它生成的数组是JPEG对象的数组,这不是我想要的。
array(<JpegImagePlugin.JpegImageFile image mode=RGB size=1000x781 at 0x2395878>, dtype=object)
而/usr目录下的python安装输出的是一个numpy数组,这正是我需要的。
array([[[ 89, 125, 51],
[ 89, 125, 51],
[ 90, 126, 52],
...,
[ 53, 55, 50],
[ 53, 55, 50],
[ 53, 55, 50]],
[[ 89, 125, 51],
[ 89, 125, 51],
[ 90, 126, 52],
...,
[ 54, 56, 51],
[ 53, 55, 50],
[ 53, 55, 50]],
...,
[[132, 134, 147],
[133, 135, 148],
[133, 135, 148],
...,
[149, 165, 190],
[149, 165, 190],
[149, 165, 190]]], dtype=uint8)
有人知道怎么解决这个问题吗?
2 个回答
我遇到了同样的问题:在我的本地机器上,numpy.asarray
没有正常工作(结果只生成了一个包含单个图像对象的数组),而在我的服务器上却正常工作,尽管两边的Python和PIL版本都是一样的,而且本地机器上的Numpy版本还更新了。
经过一番调查,我终于发现问题出在PIL的编译上,它没有支持某些格式。在我的情况下,当我试图打印本地机器上PIL返回的图像对象的__array_interface__
字段时,出现了IOError: Decoder 'zip' not available
的错误。
为了安装支持大多数常见图像格式的PIL,我直接使用了系统库里的包,而不是用pip安装PIL,这样一切就正常了:
sudo pip uninstall PIL
sudo apt-get install python-pil
不过,我也成功地用pip让一切正常工作。我按照以下步骤操作(来自IOError: decoder zip not available)。
首先,我在系统中安装了必要的库:
sudo apt-get install libjpeg62-dev zlib1g-dev libfreetype6-dev
出于某种原因,pip没有识别到这些库,所以我需要把它们链接到我的64位机器上的/usr/lib
目录:
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib
由于那时PIL的安装仍然因为缺少头文件而失败,我不得不创建另一个符号链接(见尝试安装PIL "pip install PIL"时遇到的错误。):
sudo ln -s /usr/include/freetype2 /usr/include/freetype
然后,我成功地用pip重新安装了PIL:
pip install -U --force-reinstall PIL
该命令的输出确认现在已经包含了对JPEG和PNG格式的支持:
*** TKINTER support not available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
*** LITTLECMS support not available
为了用NumPy读取和写入图片,我通常会使用以下两种方法之一:
from scipy.misc import imread, imsave
image = imread("filename.jpg")
或者
from skimage.io import imread, imsave
而不是直接使用PIL/Pillow这个库。