numpy.asarray( Image.open ( ...) ) 无法正常工作

1 投票
2 回答
2307 浏览
提问于 2025-04-17 20:52

我觉得使用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 个回答

0

我遇到了同样的问题:在我的本地机器上,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
2

为了用NumPy读取和写入图片,我通常会使用以下两种方法之一:

from scipy.misc import imread, imsave
image = imread("filename.jpg")

或者

from skimage.io import imread, imsave

而不是直接使用PIL/Pillow这个库。

撰写回答