Как преобразовать изображение PIL в массив numpy?



хорошо, я играю с преобразованием объекта изображения PIL туда и обратно в массив numpy, чтобы я мог делать некоторые более быстрые пиксельные преобразования пикселей, чем PIL

953   5  

5 ответов:

вы не говорите, как именно putdata() не ведет себя. Я предполагаю, что вы делаете

>>> 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, "правильный" способ преобразования между изображениями и массивами numpy просто

>>> pix = numpy.array(pic)

хотя результирующий массив находится в другом формате, чем ваш (3-d массив или строки / столбцы / rgb в этом случае).

затем, после внесения изменений в массив, вы должны быть в состоянии сделать что-либо pic.putdata(pix) или создать новое изображение с Image.fromarray(pix).

открыть I как массив:

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

сделать некоторые вещи, чтобы I, затем преобразуйте его обратно в изображение:

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

фильтр numpy изображений с БПФ, Python

если вы хотите сделать это явно по какой-то причине, есть pil2array() и array2pil() функции, использующие getdata() на на этой странице в корреляции.застежка-молния.

я использую подушку 4.1.1 (преемник PIL) в Python 3.5. Преобразование между подушкой и 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)

одна вещь, которую нужно заметить, это подушка-стиль im является основным столбцом, а numpy-style im2arr строке-майор. Однако, функция Image.fromarray уже принимает это во внимание. То есть, arr2im.size == im.size и arr2im.mode == im.mode в приведенном выше примере.

мы должны позаботиться о формате данных HxWxC при обработке преобразованного numpy массивы, например, сделать преобразование im2arr = np.rollaxis(im2arr, 2, 0) или im2arr = np.transpose(im2arr, (2, 0, 1)) в формат CxHxW.

вам нужно преобразовать изображение в массив numpy следующим образом:

import numpy
import PIL

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

пример, который я использовал сегодня:

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)

Comments

    Ничего не найдено.