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-styleim2arrстроке-майор. Однако, функция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