Слияние ndarray изображения - PullRequest
       0

Слияние ndarray изображения

4 голосов
/ 25 сентября 2019

У меня есть изображение как ndarray с формой (2000, 2000, 3).На следующем шаге разделите каналы, чтобы поработать над ними:

image_r = (image_color[:,:,0])
image_g = (image_color[:,:,1])
image_b = (image_color[:,:,2])

Когда работа будет завершена, мне нужно объединить каналы в одно изображение.Как мне это сделать?

Я попытался создать пустое изображение full_image = np.zeros((image.shape[0], image.shape[1]), 3) И добавить к нему каналы.Но это не сработало.

Я также пытался складывать значения, используя hstack.

full_image = np.zeros((image.shape[0], image.shape[1]))
full_image = np.hstack(full_image, image_r)
full_image = np.hstack(full_image, image_g)
full_image = np.hstack(full_image, image_b)

Но это тоже не сработало.Со следующей ошибкой:

full_image = np.hstack(full_image, image_r)
  File "<__array_function__ internals>", line 4, in hstack
TypeError: _vhstack_dispatcher() takes 1 positional argument but 2 were given

У вас есть идеи?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

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

zeros требует одного кортежа для описания размера массива, а не двух отдельных аргументов:

 full_image = np.zeros((image.shape[0], image.shape[1], 3))
 full_image[..., 0] = image_r
 full_image[..., 1] = image_g
 full_image[..., 2] = image_b

hstack сцепляетсявдоль второго измерения.Вы хотите объединить вдоль третьего, поэтому либо используйте dstack, либо просто stack.В любом случае первый аргумент - это кортеж, содержащий все массивы, которые вы хотите объединить:

full_image = np.dstack((image_r, image_g, image_b))

или

full_image = np.stack((image_r, image_g, image_b), axis=2)

Вы можете даже использовать concatenate, но я действительно не рекомендую это.concatenate принимает кортеж из всех массивов, к которым вы хотите присоединиться, например, stack, но он работает с измерением, которое уже существует, поэтому вы должны создать его:

full_image = np.concatenate((image_r[..., None], image_g[..., None], image_b[..., None]), axis=2)
1 голос
/ 25 сентября 2019

Используйте dstack, чтобы сложить массивы вдоль третьей оси:

full_image = np.dstack([image_r, image_g, image_b])

image_color = np.random.randint(0,255,(2000, 2000, 3))

image_r = (image_color[:,:,0])
image_g = (image_color[:,:,1])
image_b = (image_color[:,:,2])

np.dstack([image_r, image_g, image_b]).shape
# (2000, 2000, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...