首页 文章

如何将PIL图像转换为numpy数组?

提问于
浏览
147

好吧,我可以允许'm toying around with converting a PIL image object back and forth to a numpy array so I can do some faster pixel by pixel transformations than PIL' s PixelAccess 对象 . 我已经想出如何通过以下方式将像素信息放在一个有用的3D numpy数组中:

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

但是我可以完成所有令人敬畏的变换 . 我知道 putdata() 方法,但似乎无法让它表现出来 .

5 回答

  • 126

    你不是说 putdata() 究竟是怎么回事 . 我'm assuming you'在做

    >>> pic.putdata(a)
    Traceback (most recent call last):
      File "...blablabla.../PIL/Image.py", line 1185, in putdata
        self.im.putdata(data, scale, offset)
    SystemError: new style getargs format but argument is not a tuple
    

    这是因为 putdata 期望一系列元组,并且你给它一个numpy数组 . 这个

    >>> data = list(tuple(pixel) for pixel in pix)
    >>> pic.putdata(data)
    

    会工作,但它很慢 .

    从PIL 1.1.6开始,"proper" way to convert between images and numpy arrays就是简单的

    >>> pix = numpy.array(pic)
    

    虽然生成的数组格式与您的格式不同(在这种情况下为3-d数组或行/列/ rgb) .

    然后,在对数组进行更改后,您应该能够 pic.putdata(pix) 或使用 Image.fromarray(pix) 创建新图像 .

  • 178

    打开 I 作为数组:

    >>> I = numpy.asarray(PIL.Image.open('test.jpg'))
    

    做一些东西到 I ,然后,将其转换回图像:

    >>> im = PIL.Image.fromarray(numpy.uint8(I))
    

    Filter numpy images with FFT, Python

    如果由于某种原因想要显式地执行它,则在correlation.zip中使用this page上的getdata()函数有pil2array()和array2pil()函数 .

  • 7

    我在Python 3.5中使用Pillow 4.1.1(PIL的后继者) . 枕头和numpy之间的转换很简单 .

    from PIL import Image
    import numpy as np
    im = Image.open('1.jpg')
    im2arr = np.array(im) # im2arr.shape: height x width x channel
    arr2im = Image.fromarray(im2arr)
    

    需要注意的一件事是Pillow风格的 im 是列专业,而numpy风格的 im2arr 是行专业 . 但是,函数 Image.fromarray 已经考虑到了这一点 . 也就是说,上例中的 arr2im.size == im.sizearr2im.mode == im.mode .

    在处理转换后的numpy数组时,我们应该处理HxWxC数据格式,例如:将 im2arr = np.rollaxis(im2arr, 2, 0)im2arr = np.transpose(im2arr, (2, 0, 1)) 转换为CxHxW格式 .

  • 36

    您需要以这种方式将图像转换为numpy数组:

    import numpy
    import PIL
    
    img = PIL.Image.open("foo.jpg").convert("L")
    imgarr = numpy.array(img)
    
  • 2

    我今天使用的例子:

    import PIL
    import numpy
    from PIL import Image
    
    def resize_image(numpy_array_image, new_height):
        # convert nympy array image to PIL.Image
        image = Image.fromarray(numpy.uint8(numpy_array_image))
        old_width = float(image.size[0])
        old_height = float(image.size[1])
        ratio = float( new_height / old_height)
        new_width = int(old_width * ratio)
        image = image.resize((new_width, new_height), PIL.Image.ANTIALIAS)
        # convert PIL.Image into nympy array back again
        return array(image)
    

相关问题