Невозможно вернуться к изображению PIL после увеличения размеров с помощью numpy - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно добавить измерение к изображению PIL, чтобы оно принималось в качестве входных данных библиотекой, которую я использую, но это дает мне ошибку.Это код:

import numpy as np
from PIL import Image

printscreen = Image.open('datasets/custom/spaceship.jpg').convert('RGB')
printscreen = np.uint8(np.expand_dims(np.array(printscreen), axis=0))
printscreen = Image.fromarray(printscreen)

В нем говорится: «Ошибка типа: невозможно обработать этот тип данных» в последней строке.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

2 решения:

Номер 1: (Вы просто хотите альфа-канал) Просто конвертируйте его в RGBA (вы получите 4-й канал)

printscreen = Image.open('some_image.jpg').convert('RGBA')

Номер 2: Более гибкий и общий подход к расширяющемуся размеру

1) Запросить размер 2D изображения

2) создать заполненное 2D изображение в градациях серогос нулями

3) объединить исходное 3D-изображение с изображением в градациях серого

4) в результате получается 4-канальное изображение, для одного канала установлено значение 0

import numpy as np
from PIL import Image

printscreen = Image.open('some_image.jpg').convert('RGB')
temp = np.asarray(printscreen)
shp = temp.shape
printscreen = np.concatenate((temp,np.zeros(shape=[shp[0],shp[1],1])),axis=2)

printscreen = Image.fromarray(printscreen.astype(np.uint8))

>>> printscreen.shape # before transformed with Image.fromarray
(397, 397, 4)

Редактировать - Общее отношение к наложению матриц на себя:

Если вы хотите, чтобы на изображениях было больше изображений:

(то же самоекак решение 2, но более выразительное)

img1 = np.zeros(shape = [10,10,3])
img2 = np.zeros(shape = [10,10,3])
img_1_2 = np.concatenate((img1,img2),axis = 2)

>>> img_1_2.shape
(10, 10, 6)

Редактировать 2:

Просто для вашей информации причина, по которой вы получаете ошибку, заключается в том, что выпытаются преобразовать массив NumPy в PIL Image в не-формате изображения.Форма является проблемой - у вас было что-то вроде (х, у, 3,1).Функция np.expand_dims делает именно то, что говорит - она ​​добавляет новое измерение, это означает, что вы фактически делаете из изображения фильм / видео.Изображение в градациях серого 2-мерное, RGB или RGBA - 3-мерное, а фильм - 4-мерное, где 4-е измерение - это время (или, лучше сказать, последовательности изображений).Преобразование между RGB в RGBA расширяет не измерение, а «объем», или, если сказать более четко, расширение размера цвета с длины 3 до длины 4

РЕДАКТИРОВАТЬ 3: Вы действительно хотите расширить до 4-гоизмерение, где дополнительное измерение будет заполнено новыми изображениями

Это решение не считается с PIL, поскольку PIL не имеет ничего общего с этим

import numpy as np


class ImageContainer(object):
    def __init__(self,first_image):
        self.container =  np.uint8(np.expand_dims(np.array(first_image), axis=0))

    def add_image(self,image):
        print(image.shape)
        temp = np.uint8(np.expand_dims(np.array(image), axis=0))
        print(temp.shape)
        self.container  = np.concatenate((self.container,temp),axis = 0)
        print(self.container.shape)

    def save_all(self,name):
        np.save(name,self.container)


img1 = np.zeros(shape = [10,10,3]) # RGB
img2 = np.zeros(shape = [10,10,3]) # RGB

cont = ImageContainer(img1)
cont.add_image(img2)

>>
(1, 10, 10, 3) # 1 image
(2, 10, 10, 3) # 2 images
0 голосов
/ 06 февраля 2019

Вот адаптация некоторого кода для обработки изображений, который я использовал ранее.Я не уверен, что это лучший метод или то, что вы ищете, но он сработал для меня при преобразовании изображения PIL в массив и обратно

import numpy as np
from PIL import Image

print_screen = Image.open('datasets/custom/spaceship.jpg').convert('RGB')
x, y = print_screen.size
print('Converting from Image to Array')
color = np.zeros((x, y, 3), dtype=np.uint8) # initialize zeros array
for i in range(0, x): # fill the array
    for j in range(0, y):
        color[i][j] = print_screen.getpixel((i, j)) #input RGB to array
print_screen = Image.fromarray(color)

Надеюсь, это поможет вам!

...