Numpy: объединить маску изображения с RGB, чтобы получить маску цветного изображения - PullRequest
0 голосов
/ 16 октября 2019

как мне объединить массив изображений бинарной маски (this_mask - форма: 4,4) с предопределенным массивом цветов (mask_color, форма: 3)

this_mask = np.array([
[0,1,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
])
this_mask.shape # (4,4)

mask_color = np.array([128, 128, 64])
mask_color.shape # (3)

, чтобы получить новыймассив изображений с цветовой маской (this_mask_colored, форма: 4,4,3)?

this_mask_colored = # do something with `this_mask` and `mask_color`
# [
#  [
#   [0,128,0],
#   [0,0,0],
#   [0,0,0],
#   [0,0,0]
#  ],
#  [
#   [0,128,0],
#   [0,0,0],
#   [0,0,0],
#   [0,0,0]
#  ],
#  [
#   [0,64,0],
#   [0,0,0],
#   [0,0,0],
#   [0,0,0]
#  ],
# ]
this_mask_colored.shape # (4,4,3)

Я пробовал циклически проходить пиксель за пикселем, медленно ли это, когда изображение имеет размер 225x225, что является лучшим способомсделать это?

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

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Это может работать:

    this_mask = np.array([
        [0,1,0,0],
        [0,0,0,0],
        [0,0,0,0],
        [0,0,0,0],
    ])
    mask_color = np.array([128, 128, 64])

    res = []
    for row in new:
        tmp = []
        for col in row:
            tmp.append(np.array([1,1,1]) * col)
        res.append(np.array(tmp))

    res = res * mask_color

Для каждой записи 1 будет преобразовано в [1, 1, 1], а 0 - [0, 0, 0]

Я делаюэто потому, что я хочу использовать преимущество операции * (поэлементное умножение)

Это работает:

    test = np.array([[0, 0, 0],
                     [1, 1, 1],
                     [0, 0, 0],
                     [0, 0, 0]])

    test * np.array([128, 128, 64])

Мы получим

    array([[  0,   0,   0],
           [128, 128,  64],
           [  0,   0,   0],
           [  0,   0,   0]])

Имы хотим поставить все расчеты на сторону NumPy. Таким образом, мы перебираем массив только для преобразования, а остальное - для numpy.

Это занимает 0,2 секунды для 255x255 из 1 с одним mask_color и 2 секунды для 1000x1000

0 голосов
/ 16 октября 2019

Следующая функция должна делать то, что вы хотите.


def apply_mask_color(mask, mask_color):
    return np.concatenate(([mask[ ... , np.newaxis] * color for color in mask_color]), axis=2)

Учитывая следующий код:


this_mask = np.array([
    [0,1,0,0],
    [0,0,0,0],
    [0,0,0,0],
    [0,0,0,0],
    ])

mask_color = np.array([128, 128, 64])

applied = apply_mask_color(this_mask, mask_color)
print(applied.shape) #(4, 4, 3)

Важно отметить, что выходные данные не совсем то, что вы ожидали,Скорее, каждый элемент внутри теперь является трехмерным массивом, содержащим значения RGB, подробно описанные в mask_color


print(applied)

Вывод:


[[[  0   0   0]
  [128 128  64]
  [  0   0   0]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]]

Я думаю, это больше, чем вы ищете.

...