最大化调色板的方差

Maximizing variance of color palette

我有许多不同长度的调色板(至少有 3 种颜色),我想确定一种方法来提取 3 种最具代表性的颜色,或者找到可以最大化“方差”的颜色调色板。例如,一个调色板(十六进制)是

['#D2691E', '#8B4513', '#A0522D',  '#0000FF', '#668B8B', '#FFC0CB']

基本上是三种深浅的棕色,然后两种深浅的蓝色,然后一种深浅的粉红色。所以我希望我的“代表调色板”是棕色、一种蓝色和一种粉红色中的一种,也许

['#D2691E', '#0000FF', '#FFC0CB']

或类似的东西。我意识到这可能并不完全直截了当,但我愿意解释什么构成了调色板中的代表性或差异,只要它是合理的。谢谢

首先我们将调色板中每种颜色的十六进制表示转换为它的 RGB 表示。

from PIL import ImageColor

palette = ['#D2691E', '#8B4513', '#A0522D',  '#0000FF', '#668B8B', '#FFC0CB']
palette_rgb = list(map(lambda x: ImageColor.getcolor(x, "RGB"), palette))

然后我们要找出彼此相距最远的三个点。 由于你的调色板很小,我们可以计算所有点之间的成对距离,然后通过暴力搜索找到路径长度最大的3-cycle。

from scipy.spatial.distance import pdist, squareform
from itertools import product

d = squareform(pdist(np.array(palette_rgb)))
best = None
best_dist = 0
for i, j, k in product(range(len(palette)), repeat=3):
    dist = d[i, j] + d[j, k] + d[k, i]
    if dist > best_dist:
        best = (i, j, k)
        best_dist = dist
furthest_colors = [palette[i] for i in best]

在这种情况下,颜色 ['#8B4513', '#0000FF', '#FFC0CB'] 的距离最大。

[注意这个解决方案可以优化,但对于这个小应用程序来说可能不值得。]