Вы можете сопоставить оттенки серого с диапазоном различных оттенков и установить постоянную насыщенность и яркость - см. статью в Википедии о HSL
#!/usr/bin/env python3
import numpy as np
import cv2
def heatmap(im):
# Map range 0..255 of greys to Hues in range 60..180
# Keep Lightness=127, Saturation=255
# https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma
H = (im.astype(np.float32) * 120./255.).astype(np.uint8) + 60
L = np.full((h,w), 127, np.uint8)
S = np.full((h,w), 255, np.uint8)
HLS = cv2.merge((H,L,S))
return cv2.cvtColor(HLS,cv2.COLOR_HLS2RGB)
# Create greyscale gradient
w, h = 256, 100
grey = np.repeat(np.arange(w,dtype=np.uint8).reshape(1,-1), h, axis=0)
cv2.imwrite('grey.png',grey) # debug only
# Apply heatmap to greyscale image
hm = heatmap(grey)
# Just for display
from PIL import Image
Image.fromarray(hm).save('result.png')
Это делает следующее изображение в оттенках серого :
And then gets transformed to this:
Or you could shell out to ImageMagick with subprocess.run()
, or use палочка (его Python привязка) для этого:
Сделайте рампу серой шкалы 100x100 - это просто настройка для создания изображение для работы:
magick -size 100x100 gradient: grey.png
Make a 5-colour тепловая карта путем изменения оттенков по кругу HSL - это нужно сделать только один раз, и вы можете сохранить и повторно использовать изображение heat.png
:
magick xc:"hsl(240,255,128)" xc:"hsl(180,255,128)" xc:"hsl(120,255,128))" xc:"hsl(60,255,128)" xc:"hsl(0,255,128)" +append heat.png
Map the shades of the greyscale image to our CLUT (colour lookup table) - this is the actual answer:
magick grey.png heat.png -clut result.png
введите описание изображения здесь