while len(colors) < minimum_number_of_colors_needed:
for index in range(1, len(colors), 2):
colors.insert(index, mean_color([colors[index - 1], colors[index]]))
. , :
colors = range(5)
while len(colors) < 15:
for index in range(1, len(colors), 2):
colors.insert(index, 99)
print(colors)
[0, 99, 99, 99, 99, 99, 99, 99, 1, 99, 99, 99, 2, 3, 4]
, 99, , .
, numpy, np.interp .
, (0, 10), (0,5, 20), (1, 30), x = [0, 0.33, 0.67, 1], y :
In [80]: np.interp([0, 0.33, 0.67, 1], [0, 0.5, 1], [10, 20, 30])
Out[80]: array([ 10. , 16.6, 23.4, 30. ])
np.interp 1D-, RGB :
[np.interp(np.linspace(0,1,min_colors), np.linspace(0,1,ncolors), self.rgb[:,i])
for i in range(nchannels)])
,
import numpy as np
import Image
def RGB_to_HEX(RGB_tuple):
"""
Return a HEX string given an RGB tuple.
"""
return "#{0:02x}{1:02x}{2:02x}".format(*np.clip(RGB_tuple, 0, 255))
def HEX_to_RGB(HEX_string):
"""
Return an RGB tuple given a HEX string.
"""
HEX = HEX_string.lstrip("#")
HEX_length = len(HEX)
return tuple(
int(HEX[i:i + HEX_length // 3], 16) for i in range(
0,
HEX_length,
HEX_length // 3 ))
class Palette(object):
def __init__(self, name=None, description=None, colors=None, *args):
super(Palette, self).__init__(*args)
self.name = name
self.description = description
self.rgb = np.array(colors)
@classmethod
def from_hex(cls, name=None, description=None, colors=None, *args):
colors = np.array([HEX_to_RGB(c) for c in colors])
return cls(name, description, colors, *args)
def to_hex(self):
return [RGB_to_HEX(color) for color in self.rgb]
def extend_palette(self, min_colors=15):
ncolors, nchannels = self.rgb.shape
if ncolors >= min_colors:
return self.rgb
return np.column_stack(
[np.interp(
np.linspace(0,1,min_colors), np.linspace(0,1,ncolors), self.rgb[:,i])
for i in range(nchannels)])
def save_image_of_palette(rgb, filename="palette.png"):
scale_x = 200
scale_y = 124
data = (np.kron(rgb[np.newaxis,...], np.ones((scale_x, scale_y, 1)))
.astype(np.uint8))
image = Image.fromarray(data)
image.save(filename)
palettes = []
palettes.append(Palette.from_hex(
name="palette1",
description="primary colors for white background",
colors=[
"#fc0000",
"#ffae3a",
"#00ac00",
"#6665ec",
"#a9a9a9", ]))
palettes.append(Palette.from_hex(
name="palette2",
description="ATLAS clarity",
colors=[
"#FEFEFE",
"#AACCFF",
"#649800",
"#9A33CC",
"#EE2200",]))
palettes = {p.name:p for p in palettes}
p = palettes['palette1']
save_image_of_palette(p.extend_palette(), '/tmp/out.png')

, HSV ( RGB) .