Применение цветовой карты к изображению в градациях серого для эффективного создания изображений RGB

Есть ли эффективный способ применения словаря цветовой карты к изображению в градациях серого для преобразования в изображение RGB с использованием функций numpy?

Например, У меня есть изображение в оттенках серого в виде массива numpy.

grayscale_image = array([[0., 0., 3.],
       [0., 2., 0.]])

и цветная карта вроде

color_map = {3: (1,2,3), 2: (4,5,6)}

Как я могу создать изображение RGB, например

rgb_image = 
array([[[0., 0., 0.],
        [0., 0., 0.],
        [1., 2., 3.]],
       [[0., 0., 0.],
        [4., 5., 6.],
        [0., 0., 0.]]])

person Deepesh    schedule 02.02.2020    source источник
comment
Непонятно, как вы индексируете окончательный результат. Ваше изображение в градациях серого имеет ширину 3 пикселя и высоту 2 пикселя. Ваш пиксель в [0,0] равен 0. Итак, почему ваш пиксель RGB находится на уровне [0,0] = [0,0,1]?   -  person Mark    schedule 02.02.2020
comment
@MarkMeyer за то, что указал на это. Я обновил вопрос.   -  person Deepesh    schedule 02.02.2020


Ответы (1)


Вы можете воспользоваться очень удобной индексацией numpy, если сделаете свою цветовую карту массивом, а не словарем. Если у вас 256 оттенков серого, у вас будет цветовая карта формы [256, 3]. Затем вы можете напрямую индексировать:

import numpy as np

gray = np.array([
    [0, 0, 3],
    [0, 2, 0]
])

color_map = np.array([
    [0,0,0],
    [0,0,0],
    [4,5,6],
    [1,2,3], 
    # ... remaining color map values
])

rgb = color_map[gray]

Результат:

array([[[0, 0, 0],
        [0, 0, 0],
        [1, 2, 3]],

       [[0, 0, 0],
        [4, 5, 6],
        [0, 0, 0]]])
person Mark    schedule 02.02.2020