создать 16-битную карту цветов в matplotlib - PullRequest
1 голос
/ 06 июня 2019

Я хотел бы раскрасить 16-битное изображение глубиной с помощью RGB colormap в matplotlib.Технически, 3 канала с 8 битами на канал должно быть достаточно, чтобы иметь различные значения rgb для всех 2 ^ 16 возможных значений глубины.

Стандартная цветовая карта 'viridis' действительно дает <1000 различных значений, даже если исходныеглубина изображения была более чем вдвое больше. </p>

Я пытался создать цветовую карту с большим количеством образцов plt.get_cmap('viridis', 2**16), но этого все еще недостаточно.

Некоторый код, чтобы описать, что япытаясь сделать:

def depth_to_rgb(path):   
    depth_map = Image.open(path)
    pixel = np.array(depth_map)
    pixel = (pixel - np.min(pixel)) / np.ptp(pixel)
    cm = plt.get_cmap('viridis', 2**16)
    pixel_colored = np.uint8(np.rint(cm(pixel) * 255))[:, :, :3]
    return Image.fromarray(pixel_colored)

Я могу немного увеличить количество различных значений на карте, создав собственный см, но этого по-прежнему недостаточно:

cm = mlp.colors.LinearSegmentedColormap.from_list("",
["red", "green", "yellow"], N=2**16)

Есть лиЦветовая карта с достаточным количеством значений или как я могу ее создать?Также приветствуются решения, связанные с библиотекой изображений подушек.

EDIT

Очевидно (благодаря ImportanceOfBeingErnest ) результирующая цветовая карта действительно имеет 2 ** 16 значений, но np.uint8(np.rint(cm(pixel) * 255)) заставил некоторых из них упасть на те же цвета.Я только напечатал количество различных цветов в полученном изображении.Я предполагаю, что мне нужно сделать что-то другое, но на оригинальный вопрос дан ответ.

1 Ответ

1 голос
/ 06 июня 2019

Viridis имеет 256 цветов.Это ListedColormap, что означает, что при повторной выборке он все равно даст вам максимальное количество цветов.Так что plt.get_cmap('viridis', 2**16) все равно даст вам 256 начальных цветов.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

cmap = plt.get_cmap("viridis", 2**16)
a = cmap(np.linspace(0,1,2**16))
print(len(a))
print(len(np.unique(a, axis=0)))

печать

65536
256

Но LinearSegmentedColormap.from_list с большим значением N должно работать.

cmap = mcolors.LinearSegmentedColormap.from_list("", ["red", "green", "yellow"], N=2**16)
a = cmap(np.linspace(0,1,2**16))
print(len(a))
print(len(np.unique(a, axis=0)))

печать

65536
65536

Есливам нужна цветовая карта viridis с 2 ^ 16 записями, вы все равно можете интерполировать между существующими 256 цветами,

cmap = mcolors.LinearSegmentedColormap.from_list("", plt.cm.viridis.colors, N=2**16)

, что приведет к 65536 цветам, как указано выше.

...