从一组十六进制颜色中获取基本颜色

12

我有一组颜色,希望将它们分解为10到20个基本颜色。

这不应该是传递进来的调色板,而应该是独立于传递进来的调色板。因此,如果使用了一张只包含各种红色阴影的图像,它将仅返回红色,可能还带有浅/深红色。

例如:我拥有下面的盒子中的颜色,以及输出行的示例。所以在这个示例中,从21种颜色的列表中缩减到了8种。

enter image description here

上面的十六进制值:

#000000
#ffffff
#003e9f
#d61517
#00a7bd
#001070
#a0210c
#dc9103
#e6151e
#fdfdfd
#011171
#fbfd10
#ffc500
#fdc605
#e6141d
#faf703
#544b20
#796a3a
#7a6b3a

最终的输出可能类似于这个颜色环的外环enter image description here


1
我不知道你在问什么。什么决定了“基色”是什么?如果你想减少图像中的颜色数量,有很多算法可以做到这一点... - Mark Reed
1
+1 对于手绘线条(不过需要更多圆圈)。 - Brad Christie
基本颜色应与颜色轮示例类似,例如:它不应输出20种相同颜色的不同阴影。 - dogmatic69
这种情况类似于 Dribbble 上的操作吗?当你选择一个帖子时,右侧会有颜色调色板吗? - cheesemacfly
1
为什么不选择20种“均匀分布”的颜色,将图像调色板化/抖动到这些颜色呢? - Ignacio Vazquez-Abrams
显示剩余2条评论
2个回答

4
请注意以下翻译内容:

事先选择您的基础颜色并制作一个数组 - 您可以使用彩色轮的外圈中的12种颜色。将关联数组用作输出的集合:对于每个输入颜色,找到最接近的基本颜色并将其添加为输出数组的键。然后返回该数组的键。

要查找颜色距离,您只需将颜色视为三维空间中的点(x,y,z)=(r,g,b),并使用欧几里得距离即可。在从十六进制字符串提取组件之后,就像这样:

$dr = $r2 - $r1; 
$dg = $g2 - $g1; 
$db = $b2 - $b1; 
$dist = sqrt($dr * $dr + $dg * $dg + $db * $db);  

如果您想要做一些高级的事情,可以使用八叉树,但是对于一个小颜色列表,只需循环遍历它们并找到最小距离即可。


这大致是我所考虑的。将会研究3D距离。 - dogmatic69

1

我认为如果您使用hsla符号,这将更容易实现(并且更易于理解)。

如果您的基本颜色始终相同,则可以为色调参数定义20个值(基本上是从0°到360°的角度),并仅使用色调将所有不同的颜色分组到最接近的“基本颜色”中。

如果您的基本颜色取决于输入(在您的问题中不清楚),那么@Mark Reed的选项可以在hsl中完成颜色距离的查找,仅使用色调,这将更准确地反映“颜色阴影”的概念。

NB:hsl的一个方便工具:http://mothereffinghsl.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接