Замена значения из одного массива значением того же индекса другого массива? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть два 3D numpy.array объекта, которые представляют два изображения.У меня есть код, который заменяет каждый черный пиксель в изображении на белый, но вместо этого я хочу заменить каждый пиксель, который не является черным в первом изображении, на «параллельный» цвет пикселя в другом изображении.Как я могу сделать это, изменив мой код?Спасибо!

r1, g1, b1 = 0, 0, 0  # Original value
r2, g2, b2 = 255, 255, 255  # Value that we want to replace it with

red, green, blue = image[:, :, 0], image[:, :, 1], image[:, :, 2]
mask = (red == r1) & (green == g1) & (blue == b1)
image[:, :, :3][mask] = [r2, g2, b2]

Ответы [ 2 ]

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

Вы можете использовать numpy.sum, чтобы проверить, является ли пиксель черным, поскольку сумма rgb будет равна нулю для этого пикселя, если и только если пиксель черный.Тест на этом суммировании предоставляет маску, которую можно использовать для обновления вашего изображения.

import numpy as np
# Assume image1 and image2 exist in memory as 3-dimensional numpy.arrays
# with shapes (M,N,k) where k is the channel depth (r,g,b -> k=3)
mask = np.sum(image1,axis=-1) > 0
image1[mask] = image2[mask]
0 голосов
/ 21 февраля 2019

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

import numpy as np

a = np.random.randint(0, 10, (5, 4))
b = np.random.randint(0, 10, (5, 4))

Давайте посмотрим, как выглядят a и b.

In [317]: a
Out[317]: 
array([[6, 0, 4, 0],
       [1, 9, 1, 6],
       [7, 2, 5, 0],
       [8, 3, 5, 0],
       [1, 8, 1, 6]])

In [318]: b
Out[318]: 
array([[1, 3, 2, 1],
       [9, 1, 9, 4],
       [9, 4, 5, 5],
       [6, 0, 6, 4],
       [5, 1, 1, 2]])

Предположим, мы хотим выбрать места, где a == 0 и b == 3, мы строим индекс (маску).idx = (a == 0) & (b == 3)

Как выглядит idx?

In [320]: idx
Out[320]: 
array([[False,  True, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])

Теперь, если вы хотите работать с массивом a, где a == 0и b == 3 (предположим, что мы хотим сделать значение a равным значению b:

a[idx] = b[idx]

Теперь, как выглядит?

In [322]: a
Out[322]: 
array([[6, 3, 4, 0],
       [1, 9, 1, 6],
       [7, 2, 5, 0],
       [8, 3, 5, 0],
       [1, 8, 1, 6]])

Имея это знание в руках,Вы можете применить тот же метод к трехмерным массивам (хотя их сложнее визуализировать).

# identify pixels that are NOT black (i.e. not equal to 0 0 0)
idx = (image1[:, :, 0] == 0) & (image1[:, :, 1] == 0) & (image1[:, :, 2] == 0)

image1[~idx] = image2[~idx]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...