计算渐变色时最容易想到的是根据RGB三个通道分别依次增加相应步长来实现,例如从(200,0,0)渐变到(0,200,0),共5种颜色时,结果应为(200,0,0)、(150,50,0)、(100,100,0)、(50,150,0)、(0,200,0)。计算RGB渐变色的Python3代码如下:
# RGB渐变色
def get_multi_colors_by_rgb(begin_color, end_color, color_count):
if color_count < 2:
return []
colors = []
steps = [(end_color[i] - begin_color[i]) / (color_count - 1) for i in range(3)]
for color_index in range(color_count):
colors.append([int(begin_color[i] + steps[i] * color_index) for i in range(3)])
return colors
RGB渐变色存在的问题:渐变色比较灰暗、不鲜艳。这是由于该算法生成的渐变色色调、饱和度、亮度的变化违反人类直觉造成的。
HSL色彩模式是工业界的一种颜色标准,是通过对色调(H)、饱和度(S)、亮度(L)三个颜色通道的变化来得到各种颜色的,这个标准几乎包括了人类视力所能感知的所有颜色,是迄今运用最广的颜色系统之一。使用HSL色彩模式计算渐变色可以得到一系列比较鲜艳、明暗均匀的颜色。计算HSL渐变色的Python3代码如下:
import cv2 as cv
import numpy as np
# RGB颜色转换为HSL颜色
def rgb2hsl(rgb):
rgb_normal = [[[rgb[0] / 255, rgb[1] / 255, rgb[2] / 255]]]
hls = cv.cvtColor(np.array(rgb_normal, dtype=np.float32), cv.COLOR_RGB2HLS)
return hls[0][0][0], hls[0][0][2], hls[0][0][1] # hls to hsl
# HSL颜色转换为RGB颜色
def hsl2rgb(hsl):
hls = [[[hsl[0], hsl[2], hsl[1]]]] # hsl to hls
rgb_normal = cv.cvtColor(np.array(hls, dtype=np.float32), cv.COLOR_HLS2RGB)
return int(rgb_normal[0][0][0] * 255), int(rgb_normal[0][0][1] * 255), int(rgb_normal[0][0][2] * 255)
# HSL渐变色
def get_multi_colors_by_hsl(begin_color, end_color, color_count):
if color_count < 2:
return []
colors = []
hsl1 = rgb2hsl(begin_color)
hsl2 = rgb2hsl(end_color)
steps = [(hsl2[i] - hsl1[i]) / (color_count - 1) for i in range(3)]
for color_index in range(color_count):
hsl = [hsl1[i] + steps[i] * color_index for i in range(3)]
colors.append(hsl2rgb(hsl))
return colors
需要安装opencv-python:
pip install opencv-python
RGB颜色和HSL颜色的具体转换算法可参考:https://docs.opencv.org/4.1.0/de/d25/imgproc_color_conversions.html
RGB渐变色和HSL渐变色的对比如下图所示,从红色(255,0,0)渐变到绿色(0,255,0),上半部分是RGB渐变色,下半部分是HSL渐变色。
可以看到RGB渐变色发灰发暗,而HSL渐变色比较鲜艳明亮,推荐使用HSL渐变色。