后续行动:通过区分"颜色"来区分颜色
原始问题
如果为我们提供了N个最大距离的颜色(以及一些相关的距离度量),我们是否可以提出一种将这些颜色按某种顺序排序的方法,以使第一个M也可以合理地接近最大不同的颜色集?
换句话说,给定一堆不同的颜色,提出一个顺序,这样我就可以从开始就使用任意数量的颜色,并有把握地保证它们都是不同的,附近的颜色也非常不同(例如蓝红色不紧靠红蓝色)。
随机化是可以的,但肯定不是最优的。
澄清:给定一些大的,视觉上不同的颜色(例如256或者1024),我想对它们进行排序,以便在我使用第一个(例如16种)时得到相对视觉上相对不同的颜色子集。大致上,这相当于说我要对1024个列表进行排序,以使各个颜色在视觉上越接近,它们在列表中的距离就越远。
解决方案
回答
我们是说要从一组N种颜色中选择M种颜色,其中M <N,以便M是M空间中N种颜色的最佳表示形式?
更好的例子是将真色(24位色彩空间)减少为8位映射色彩空间(GIF?)。
为此,有一些量化算法,例如ImageMagic使用的"自适应空间细分"算法。
这些算法通常不仅从源空间中选择现有颜色,而且还会在目标空间中创建与源颜色最相似的新颜色。举一个简化的例子,如果原始图像中有3种颜色,其中两种是红色(强度或者蓝调等),而第三种是蓝色,并且需要减少为两种颜色,则目标图像可能会是红色这是原始图像中原始两个红色+蓝色的平均值。
如果我们还需要其他东西,那么我不明白问题:)
回答
我们可以将它们拆分为RGB HEX格式,以便可以将R与不同颜色的R(与G和B相同)进行比较。
与HTML格式相同
XX XX XX RR GG BB 00 00 00 = black ff ff ff = white ff 00 00 = red 00 ff 00 = green 00 00 ff = blue
因此,我们唯一需要决定的就是颜色要多近,以及将这些段视为不同时可接受的差异。
回答
在我看来,这听起来像某种电阻图,我们尝试绘制最小电阻的路径。如果我们颠倒了要求,即最大阻力的路径,则可能会使用它来生成一组,从一开始就产生最大的差值,直到结束时才开始返回更接近其他值的值。
例如,这是一种也许可以做我们想要的事情的方法。
- 计算每种颜色到所有其他颜色的距离(请参阅其他文章)
- 总结每种颜色的距离,这可以指示该颜色与所有其他颜色的总距离
- 按距离排序列表,向下排序
看起来,这将产生一个列表,该列表以与所有其他颜色相距最远的颜色开始,然后下降,直到列表末尾的颜色通常更接近于其他颜色。
编辑:阅读我们对我关于空间细分的第一篇文章的回复并不完全符合上面的描述,因为接近其他颜色的颜色将落在列表的底部,但是假设我们在某处有一个颜色簇该簇中的至少一种颜色将位于列表的开头附近,并且通常是与所有其他颜色相距最远的颜色。如果那是有道理的。
回答
这个问题称为色彩量化,并且有许多众所周知的算法:http://en.wikipedia.org/wiki/Color_quantization我知道人们实施八叉树方法的效果很好。
回答
感觉对我们来说很重要,在这种情况下,我们可能需要考虑使用诸如YUV,YCbCr或者Lab之类的可感知色彩空间。每次使用它们时,它们给我的效果都比单独使用sRGB好得多。
往返于sRGB可能会很痛苦,但是在情况下,它实际上可以使算法更简单,此外,它也同样适用于色盲!
回答
可以将N个最大距离的颜色视为3维(彩色)空间中一组分布良好的点。如果可以从Halton序列生成它们,则任何前缀(前M个颜色)也都包含分布良好的点。
回答
如果我正确地理解了这个问题,则在给定一些距离函数d的情况下,我们希望获得颜色之间平均距离最高的M种颜色的子集。
换句话说,将N种颜色的初始集合视为连接所有颜色的大型无向图,我们希望找到访问任何M个节点的最长路径。
恐怕我无法解决NP完全图的问题,但是我们可以尝试运行简单的物理模拟:
- 在色彩空间中生成M个随机点
- 计算每个点之间的距离
- 计算每个点的排斥向量,以使其远离所有其他点(使用1 /(距离^ 2)作为向量的大小)
- 对每个点的排斥向量求和
- 根据相加的排斥向量更新每个点的位置
- 约束任何超出范围的坐标(例如,亮度为负或者大于1)
- 从步骤2重复,直到点稳定
- 对于每个点,请从原始N组中选择最接近的颜色
它远非高效,但对于较小的M来说,它可能足够高效,并且将提供接近最佳的结果。
如果色距函数很简单,则可能会有更多确定性的方式来生成最佳子集。
回答
- 从两个列表开始。 CandidateColors(最初包含不同颜色)和SortedColors(最初为空)。
- 选择任何颜色并将其从CandidateColors中删除,然后将其放入SortedColors中。这是第一种颜色,并且将是最常见的颜色,因此它是选择适合应用程序的颜色的好地方。
- 对于CandidateColors中的每种颜色,计算其总距离。总距离是从CandidateColor到SortedColors中每种颜色的距离之和。
- 删除与CandidateColors的总距离最大的颜色,并将其添加到SortedColors的末尾。
- 如果CandidateColors不为空,请返回到步骤3.
这种贪婪算法应该会给我们带来良好的效果。