Python Изображение PIL из ошибки типа данных массива - PullRequest
1 голос
/ 06 мая 2020

Я поигрался с PIL, чтобы понять его, и хотел разделить изображение на его каналы rgb, снова собрать его и показать.

import PIL.Image as Img
import numpy as np

img = Img.new('RGB', (10,10), color = 'cyan')
r,g,b = img.split()
pixels = np.array([np.asarray(r),np.asarray(g),np.asarray(b)])
new_img = Img.fromarray(pixels.astype(np.uint8))
new_img.show()

когда я запускаю файл возвращает ошибку:

File "C:\Program Files (x86)\Python38-32\lib\site-packages\PIL\Image.py", line 2716, in fromarray
    raise TypeError("Cannot handle this data type: %s, %s" % typekey)
TypeError: Cannot handle this data type: (1, 1, 10), |u1

Я также пробовал вот так:

import PIL.Image as Img
import numpy as np

img = Img.new('RGB', (10,10), color = 'cyan')
r,g,b = img.split()
pixels = [np.asarray(r),np.asarray(g),np.asarray(b)]
new_img = Img.fromarray(pixels)
new_img.show()

Где я получил эту ошибку:

File "C:\Program Files (x86)\Python38-32\lib\site-packages\PIL\Image.py", line 2704, in fromarray
    arr = obj.__array_interface__
AttributeError: 'list' object has no attribute '__array_interface__'

Итак, как мне правильно собрать массивы r, g и b вместе?

1 Ответ

0 голосов
/ 06 мая 2020

Изображение RGB создается путем наложения 3 цветных каналов один над другим по оси z. См. Это изображение для аналогии:

enter image description here

pixels = np.array([np.asarray(r),np.asarray(g),np.asarray(b)])

Эта команда помещает эти 3 цветных канала рядом, вы можете проверить shape, используя

print(pixels.shape)

(3, 10, 10)

Это не имеет смысла для интерпретатора, поэтому сообщение об ошибке.

Каждый пиксель в изображении RBG представляет собой набор значений красного, зеленого и синего цветов.

enter image description here

таким образом форма принимает форму rows x cols x channels. Вы можете добиться этого, используя np.stack

pixels = np.stack([np.asarray(r),np.asarray(g),np.asarray(b)], axis = 2)
...