Подтвердить что ты не робот

Каков алгоритм создания цветов для тепловой карты?

Предполагая, что значения нормированы от 0 до 1, каков алгоритм, чтобы получить цвет для создания такой тепловой карты?

1 красный,.5 зеленый, 0 - синий.

Работа в RMagick/ImageMagick.

heatmap

4b9b3361

Ответ 1

Я нашел это удивительно легко связанным с HSL.

В Ruby:

def heatmap_color_for value # [0,1]
  h = (1 - value) * 100
  s = 100
  l = value * 50
  "hsl(#{h.round(2)}%,#{s.round(2)}%,#{l.round(2)}%)"
end

Этот метод возвращает значения HSL в виде строки от 0% до 100%. Его можно использовать с RMagick или ImageMagick.

Ссылка: Документация ImageMagick HSL.

Ответ 2

Вот фрагмент кода JavaScript для генерации цветового кода CSS hsl из значения [0, 1]

function heatMapColorforValue(value){
  var h = (1.0 - value) * 240
  return "hsl(" + h + ", 100%, 50%)";
}

Этот алгоритм основан на 5 цветной тепловой карте,

В этом алгоритме цвета, соответствующие значениям,

0    : blue   (hsl(240, 100%, 50%))
0.25 : cyan   (hsl(180, 100%, 50%))
0.5  : green  (hsl(120, 100%, 50%))
0.75 : yellow (hsl(60, 100%, 50%))
1    : red    (hsl(0, 100%, 50%))

Так просто!

Ответ 3

Линейная интерполяция компонентов RGB работает на практике довольно хорошо, и ссылка, которую Бруно разделяет, упоминает о вашей интерполяции в HSL, которая может помочь.

Вы также можете пересечь три основных цвета с более красиво выбранными промежуточными продуктами. Посмотрите http://colorbrewer2.org/ для некоторых хороших цветовых прогрессий. Затем выполните следующие шаги:

0    red
0.25 yellow
0.5  green
0.75 cyan
1    blue

Ответ 4

Общий подход - интерполировать цвета. Вы решили, что

0: 0 0 255 (or any blue)
0.5: 0 255 0 (or any green)
1: 255 0 0 (or any red)

Вы просто выполняете линейную интерполяцию RGB. Между двумя опорными значениями (например, t между 0 и 0,5) интерполированный цвет C похож на

C = (1 - t) * c0 + t * c1

Вы должны применить эту формулу для каждого цветового компонента RGB. Некоторые другие подсказки о цветовой линейной интерполяции: Как интерполировать последовательность цветов?

---- править ----- Я удалил заголовок своего ответа, так как понял, что неправильно понял вопрос (см. Комментарий). Я оставляю копию для постоянного чтения и информации на всякий случай.

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

Ответ 5

Здесь простая 5-цветная тепловая карта в питоне (в pyqt, но легко обобщается)

def genColorMap(self):
    points = [(255,0,0), (255,255,0), (0,255,0), (0,255,255), (0,0,255)]
    cm = {}
    for i in range(0, 256):
        p0 = int(numpy.floor((i/256.0)/len(points)))
        p1 = int(numpy.ceil((i/256.0)/len(points)))
        rgb = map(lambda x: x[0]*max(0,(i-p0)) + x[1]*max(0,(i-p1)), zip(points[p0], points[p1]))
        cm[i] = QtGui.qRgb(rgb[0], rgb[1], rgb[2])
    return cm