最大化调色板的方差
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']
的距离最大。
[注意这个解决方案可以优化,但对于这个小应用程序来说可能不值得。]
我有许多不同长度的调色板(至少有 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']
的距离最大。
[注意这个解决方案可以优化,但对于这个小应用程序来说可能不值得。]