Создать соответствующий список RGB (цветовую карту) на основе значений в другом списке - PullRequest
2 голосов
/ 04 мая 2020

Я работаю с раскрашиванием трехмерного точечного облака в python.

По сути, у меня есть список точек, каждая точка имеет определенное значение глубины (расстояния). Я хочу создать соответствующий список значений RGB на основе этих значений расстояния.

Пример из 10 точек:

distance_list = [0.1, 0.3, 0.4, 0.5, 1.2, 6, 8.1, 0.9, 5, 0.7]

То, что я хочу получить, это список значений RGB (цветовая карта) между красным и синим, или любыми другими 2 цветами, с этими значениями соответствует расстояние, поэтому красный - самый близкий, а синий - самая дальняя точка.

Так что более или менее, у меня было бы что-то вроде

rgb_list = [(255, 0, 0), (R2, G2, B2), (R3, G3, B3), (R4, G4, B4), (R5, G5, B5), (R6, G6, B6), (0, 0, 255), (R8, G8, B8), (R9, G9, B9), (R10, G10, B10)]

Я пытался использовать готовые карты цветов из matplotlib, но мне не удалось настроить его на основе имеющихся у меня значений и извлечь из него значения RGB.

1 Ответ

0 голосов
/ 04 мая 2020

matplotlib имеет встроенные цветовые карты, которые нормализуются между 0 и 1, но мы можем согласовать цветовую карту с вашими данными, нормализовав цветовую карту до минимального и максимального значений вашего distance_list.

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

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm

distance_list = [0.1, 0.3, 0.4, 0.5, 1.2, 6, 8.1, 0.9, 5, 0.7]

min_val, max_val = min(distance_list), max(distance_list)

# use the coolwarm colormap that is built-in, and goes from blue to red
cmap = mpl.cm.coolwarm
norm = mpl.colors.Normalize(vmin=min_val, vmax=max_val)

# convert your distances to color coordinates
color_list = cmap(distance_list)

fig, ax = plt.subplots()
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, ticks = sorted(distance_list), orientation='horizontal')
cb.set_label('Distance (least to greatest)')
ax.tick_params(axis='x', rotation=90)

plt.show()

enter image description here

> color_list
array([[0.34832334, 0.46571115, 0.88834616, 1.        ],
       [0.61931795, 0.74412073, 0.99893092, 1.        ],
       [0.75361062, 0.83023285, 0.96087116, 1.        ],
       [0.86742764, 0.8643766 , 0.86260246, 1.        ],
       [0.70567316, 0.01555616, 0.15023281, 1.        ],
       [0.70567316, 0.01555616, 0.15023281, 1.        ],
       [0.70567316, 0.01555616, 0.15023281, 1.        ],
       [0.83936494, 0.32185622, 0.26492398, 1.        ],
       [0.70567316, 0.01555616, 0.15023281, 1.        ],
       [0.96849975, 0.67397738, 0.55664926, 1.        ]])
...