獲得任意N個區分度最高的RGB顏色值是一個經典的問題,之前在做一些可視化的東西時需要解決這個問題。首先去網上找了一些方法,未果,於是想自己來搞,心里的想法是,先給出一個距離函數用來度量兩個RGB顏色值的區分度,然后再通過隨機和貪心的方式依次獲得N個顏色值。如果要這樣搞的話,距離函數的定義就非常關鍵了,這就避免不了要去看一些學術論文,想着就有點畏懼,又要查文獻、讀文獻,感覺要花好幾天時間。於是就先放下了,用隨機生成顏色的方法來解決,但是效果很不好。今天又認真的查了一些資料,發現10年前,已經有人在Stack Overflow上問過了,其中第二個回答很全面,獲贊最多,既給出了一些文獻研究,又在N比較小的情況下給出了一些簡單的解決方案。第一個回答的獲贊也不少,而且非常簡單,在這里,我就選了第一個回答用python實現了一下,其思路是先通過隨機的方式獲得N個區分度比較高的HLS顏色值,然后再將其轉換為RGB顏色,代碼如下所示(GitHub地址)。
import colorsys
import random
def get_n_hls_colors(num):
hls_colors = []
i = 0
step = 360.0 / num
while i < 360:
h = i
s = 90 + random.random() * 10
l = 50 + random.random() * 10
_hlsc = [h / 360.0, l / 100.0, s / 100.0]
hls_colors.append(_hlsc)
i += step
return hls_colors
def ncolors(num):
rgb_colors = []
if num < 1:
return rgb_colors
hls_colors = get_n_hls_colors(num)
for hlsc in hls_colors:
_r, _g, _b = colorsys.hls_to_rgb(hlsc[0], hlsc[1], hlsc[2])
r, g, b = [int(x * 255.0) for x in (_r, _g, _b)]
rgb_colors.append([r, g, b])
return rgb_colors
---------------------