Хорошо, я играю с преобразованием объекта изображения PIL взад-вперед в массив, чтобы я мог сделать более быстрое преобразование пиксель за пикселем, чем PixelAccess
позволил бы объект PIL . Я выяснил, как разместить информацию о пикселях в полезном трехмерном массиве с помощью:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Но я не могу понять, как загрузить его обратно в объект PIL после того, как я выполнил все свои удивительные преобразования. Я знаю о putdata()
методе, но не могу заставить его вести себя.
pic.size[0]
иpic.size[1]
следует поменять местами (т. Е.reshape(pic.size[1], pic.size[0], 3)
), Посколькуsize
естьwidth x height
илиx * y
, в то время как порядок упорядочения матрицыrows x columns
.Ответы:
Вы не говорите, как именно
putdata()
не ведет себя. Я предполагаю, что вы делаетеЭто потому, что
putdata
ожидает последовательность кортежей, а вы присваиваете ей пустой массив. этобудет работать, но это очень медленно.
Начиная с PIL 1.1.6, «правильный» способ преобразования между изображениями и массивами просто
хотя полученный массив имеет формат, отличный от вашего (в этом случае 3-й массив или row / columns / rgb).
Затем, после того, как вы внесете изменения в массив, вы сможете сделать то же самое
pic.putdata(pix)
или создать новое изображение с помощьюImage.fromarray(pix)
.источник
Image.fromarray
не указано в документации PIL (!), Поэтому я бы никогда не нашел его, если бы не это.numpy.asarray(pic)
как «правильный» способ конвертации, а неnumpy.array(pic)
. Согласно этому ответуarray
сделаю копию, аasarray
не будет (но тогдаasarray
результат будет только для чтения).Открыть
I
как массив:Сделайте некоторые вещи, чтобы
I
затем преобразовать их обратно в изображение:Фильтрация изображений с помощью FFT, Python
Если вы хотите сделать это явно по какой-то причине, есть функции pil2array () и array2pil (), использующие getdata () на этой странице в correlation.zip.
источник
import Image
первый? У вас установлен PIL?uint8
Нужно ли преобразование?numpy.asarray(Image.open(filename))
Кажется, работает для изображений .jpg, но не для .png. Результат отображается какarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Кажется, нет никаких явно названных методовPngImagePlugin.PngImageFile
объекта для решения этого. Думаю, я должен задать это как новый вопрос, но это очень актуально для этой темы. Кто-нибудь понимает, что здесь происходит не так?getdata()
возвращает последовательность, подобную объекту ( pillow.readthedocs.io/en/3.4.x/reference/… ), но изображение подушки реализует то,__array_interface__
чтоnumpy
можно использовать для доступа к необработанным байтам изображения без необходимости проходить через итератор (см. github.com/python-pillow/Pillow/blob/… и docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Вы можете даже просто использоватьnumpy.array(PIL.Image.open('test.jpg'))
Я использую Pillow 4.1.1 (преемник PIL) в Python 3.5. Преобразование между Подушкой и NumPy является простым.
Одна вещь, на которую нужно обратить внимание, заключается в том, что стиль подушек
im
- основной столбец, в то время как стиль пустышекim2arr
- основной ряд. Однако функцияImage.fromarray
уже принимает это во внимание. То естьarr2im.size == im.size
иarr2im.mode == im.mode
в приведенном выше примере.Мы должны позаботиться о формате данных HxWxC при обработке преобразованных числовых массивов, например, выполнить преобразование
im2arr = np.rollaxis(im2arr, 2, 0)
илиim2arr = np.transpose(im2arr, (2, 0, 1))
в формат CxHxW.источник
np.flipud
исправления. Хотя мое изображение PIL было создано с нуля, используяImageDraw.Draw
. Я думаю, что нужно быть осторожным, откуда происходит их координаты.Вам нужно преобразовать ваше изображение в массив numy следующим образом:
источник
.convert("L")
на.convert("RGB")
Пример, который я использовал сегодня:
источник
Если ваше изображение хранится в формате BLOB-объектов (т. Е. В базе данных), вы можете использовать ту же технику, которая описана Биллом Бегераджем, чтобы преобразовать ваше изображение из BLOB-объектов в байтовый массив.
В моем случае мне нужны были мои изображения, которые хранятся в столбце BLOB-объектов в таблице БД:
Затем я создал вспомогательную функцию для изменения набора данных в np.array:
После этого я смог использовать byteArrays в моей нейронной сети.
источник
Конвертировать
Numpy to PIL
изображение иPIL to Numpy
источник
Вы можете преобразовать изображение в NumPy, проанализировав изображение в функцию NUMPY () после удаления функций (ненормализация)
источник