Как я могу использовать NumPy для компоновки N слоев данных изображения в градациях серого с каждым слоем, раскрашенным в пространстве RGB? - PullRequest
0 голосов
/ 01 июля 2019

Рассмотрим этот тривиальный пример с тремя цветами (красным, синим и зеленым):

layers = {
  'red': np.random.rand(100, 100),
  'blu': np.random.rand(100, 100),
  'grn': np.random.rand(100, 100)
}

# Express composite as 3-channel RGB data
composite_arr = np.zeros(shape=(100, 100, 3))

# For each channel red, blue, and green, insert the data for the corresponding layer
composite_arr[:, :, 0] = layers['red']
composite_arr[:, :, 1] = layers['blu']
composite_arr[:, :, 2] = layers['grn']

# Finally, output the image expressed in RGB
composite_img = Image.fromarray(np.array(composite_arr * 255, dtype=np.uint8), mode="RGB")
composite_img.save('test.png')

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

layers = [
    np.random.rand(100, 100),
    np.random.rand(100, 100),
    np.random.rand(100, 100),
    np.random.rand(100, 100)
}

Допустим, мы выбрали четыре тетрадных цвета в пространстве RGB, чтобы применить один к каждому слою:

colors = {
    (1, 0, 0),
    (0, 1, 1),
    (0, 0, 1),
    (1, 1, 0)
}

Как я могу аналогичным образом создать композит для четырех слоев в приведенном выше примере?

А как насчет любого количества слоев и цветов?

Я ищу обобщенное выражение, которое можно последовательно применить к composite_arr, которое обновит его для любого количества слоев и цветов.

В качестве альтернативы, если это можно сделать эффективно, используя PIL или аналогичная библиотека для раскрашивания каждого слоя и применения некоторой составной функции, пожалуйста, предложите, как это можно сделать.

Спасибо!


Редактировать: Чтобы уточнить, я хотел быконечный результат должен быть выражен в пространстве RGB.Таким образом, любое количество слоев должно соответствовать этому (следуя приведенным выше примерам изображений 100x100):

composite_arr = np.zeros(shape=(100, 100, 3))
...