2016-06-09 2 views
1

У меня есть изображение RGB img, которое имеет форму (2560L, 1920L, 3L) и другое изображение одного канала mask, имеющее форму (2560L, 1920L). Теперь, я хочу сделать это mask формы (2560L, 1920L, 3L) i.e. Я хочу скопировать данные одного канала во все три канала.Копирование каналов в массиве Numpy

Я делаю это следующим образом.

np.array([[[j,j,j] for j in i] for i in mask]) 

Есть ли более быстрый способ сделать это, используя numpy?

ответ

2

Если вы абсолютно хотите иметь маску будучи (2560, 1920, 3), вы можете просто развернуть его вдоль оси (есть несколько способов сделать это, но это один довольно простой):

>>> mask = np.random.random_integers(0, 255, (15, 12)) 
>>> mask_3d = mask[:, :, None] * np.ones(3, dtype=int)[None, None, :] 
>>> mask.shape 
(15L, 12L) 
>>> mask_3d.shape 
(15L, 12L, 3L) 

Однако в В общем, вы можете использовать эти broadcasts напрямую. Например, если вы хотите, чтобы умножить свое изображение на вашей маске:

>>> img = np.random.random_integers(0, 255, (15, 12, 3)) 
>>> img.shape 
(15L, 12L, 3L) 
>>> converted = img * mask[:, :, None] 
>>> converted.shape 
(15L, 12L, 3L) 

Таким образом, вы никогда не есть создать (n, m, 3) маску: Вещание осуществляется на лету, управляя шагами массива маски, а не создавая большую, избыточную. Большинство Numpy поддержка операций такого рода вещание: бинарные операции (как описано выше), но и indexing:

>>> # Take the lower part of the image 
>>> mask = np.tri(15, 12, dtype=bool) 
>>> # Apply mask to first channel 
>>> one_channel = img[:, :, 0][mask] 
>>> one_channel.shape 
(114L,) 
>>> # Apply mask to all channels 
>>> pixels = img[mask] 
>>> pixels.shape 
(114L, 3L) 
>>> np.all(pixels[:, 0] == one_channel) 
True 
+0

Спасибо, что помогло. Второй отрывок особенно. :) –

3
np.repeat(mask.reshape(2560L, 1920L, 1L), 3, axis=2) 
Смежные вопросы