no need to reinvent the wheel

This commit is contained in:
Martin Diehl 2021-08-28 17:49:44 +02:00
parent b96f1baf4e
commit a1bd633a9f
1 changed files with 11 additions and 93 deletions

View File

@ -1,6 +1,7 @@
import os import os
import json import json
import functools import functools
import colorsys
import numpy as np import numpy as np
import matplotlib as mpl import matplotlib as mpl
@ -439,109 +440,26 @@ class Colormap(mpl.colors.ListedColormap):
@staticmethod @staticmethod
def _hsv2rgb(hsv): def _hsv2rgb(hsv):
""" """H(ue) S(aturation) V(alue) to R(red) G(reen) B(lue)."""
H(ue) S(aturation) V(alue) to R(red) G(reen) B(lue). return np.array(colorsys.hsv_to_rgb(hsv[0]/360.,hsv[1],hsv[2]))
References
----------
https://www.rapidtables.com/convert/color/hsv-to-rgb.html
"""
sextant = np.clip(int(hsv[0]/60.),0,5)
c = hsv[1]*hsv[2]
x = c*(1.0 - abs((hsv[0]/60.)%2 - 1.))
return np.array([
[c, x, 0],
[x, c, 0],
[0, c, x],
[0, x, c],
[x, 0, c],
[c, 0, x],
])[sextant] + hsv[2] - c
@staticmethod @staticmethod
def _rgb2hsv(rgb): def _rgb2hsv(rgb):
""" """R(ed) G(reen) B(lue) to H(ue) S(aturation) V(alue)."""
R(ed) G(reen) B(lue) to H(ue) S(aturation) V(alue). h,s,v = colorsys.rgb_to_hsv(rgb[0],rgb[1],rgb[2])
return np.array([h*360,s,v])
References
----------
https://www.rapidtables.com/convert/color/rgb-to-hsv.html
"""
C_max = rgb.max()
C_min = rgb.min()
Delta = C_max - C_min
v = C_max
s = 0. if np.isclose(C_max,0.) else Delta/C_max
if np.isclose(Delta,0.):
h = 0.
elif rgb.argmax() == 0:
h = (rgb[1]-rgb[2])/Delta%6
elif rgb.argmax() == 1:
h = (rgb[2]-rgb[0])/Delta + 2.
elif rgb.argmax() == 2:
h = (rgb[0]-rgb[1])/Delta + 4.
h = np.clip(h,0.,6.) * 60.
return np.array([h,s,v])
@staticmethod @staticmethod
def _hsl2rgb(hsl): def _hsl2rgb(hsl):
""" """H(ue) S(aturation) L(uminance) to R(red) G(reen) B(lue)."""
H(ue) S(aturation) L(uminance) to R(red) G(reen) B(lue). return np.array(colorsys.hls_to_rgb(hsl[0]/360.,hsl[2],hsl[1]))
References
----------
https://www.rapidtables.com/convert/color/hsl-to-rgb.html
"""
sextant = np.clip(int(hsl[0]/60.),0,5)
c = (1.0 - abs(2.0 * hsl[2] - 1.))*hsl[1]
x = c*(1.0 - abs((hsl[0]/60.)%2 - 1.))
m = hsl[2] - 0.5*c
return np.array([
[c+m, x+m, m],
[x+m, c+m, m],
[m, c+m, x+m],
[m, x+m, c+m],
[x+m, m, c+m],
[c+m, m, x+m],
])[sextant]
@staticmethod @staticmethod
def _rgb2hsl(rgb): def _rgb2hsl(rgb):
""" """R(ed) G(reen) B(lue) to H(ue) S(aturation) L(uminance)."""
R(ed) G(reen) B(lue) to H(ue) S(aturation) L(uminance). h,l,s = colorsys.rgb_to_hls(rgb[0],rgb[1],rgb[2])
return np.array([h*360,s,l])
References
----------
https://www.rapidtables.com/convert/color/rgb-to-hsl.html
"""
C_max = rgb.max()
C_min = rgb.min()
Delta = C_max - C_min
l = np.clip((C_max + C_min)*.5,0.,1.) # noqa
s = 0. if np.isclose(C_max,C_min) else Delta/(1.-np.abs(2*l-1.))
if np.isclose(Delta,0.):
h = 0.
elif rgb.argmax() == 0:
h = (rgb[1]-rgb[2])/Delta%6
elif rgb.argmax() == 1:
h = (rgb[2]-rgb[0])/Delta + 2.
elif rgb.argmax() == 2:
h = (rgb[0]-rgb[1])/Delta + 4.
h = np.clip(h,0.,6.) * 60.
return np.array([h,s,l])
@staticmethod @staticmethod