1

也许我喝了太多咖啡,也许我工作太久了,无论如何,我对这种方法的作用感到茫然,或者更确切地说,为什么以及如何做到这一点,任何人都可以对我有所了解? 下一个颜色是什么?

public Color nextColor() {
   int max = 0, min = 1000000000, cr = 0, cg = 0, cb = 0;
   for (int r = 0; r < 256; r += 4) {
      for (int g = 0; g < 256; g += 4) {
         for (int b = 0; b < 256; b += 4) {
            if (r + g + b < 256 || r + g + b > 512) {
               continue;
            }
            min = 1000000000;
            for (Color c : colorTable) {
               int dred   = r - c.getRed();
               int dgreen = g - c.getGreen();
               int dblue  = b - c.getBlue();
               int dif = dred * dred + dgreen * dgreen + dblue * dblue;
               if (min > dif) {
                  min = dif;
               }
            }
            if (max < min) {
               max = min;
               cr  = r;
               cg  = g;
               cb  = b;
            }
         }
      }
   }

   return new Color(cr, cg, cb, 0x90);
}

更新

感谢大家的回复。查看程序中方法的上下文很明显,他们的意图确实是返回一个新颜色,该颜色与现有颜色集“最远”。

感谢 Sparr 对这个问题提出后续建议,我一定会根据您的建议重写上述内容。

我对 RGB 色标不是很精通。知道上述方法的意图是检索“免费”吗?颜色与现有的一组颜色相比,在我们如何感知颜色的意义上,1中提供的解决方案实际上是互补的吗?有没有一种更简单的方法来选择一种可以补充集合的颜色,或者 RGB 分量的数值分析实际上是否会产生适当的颜色?

4

4 回答 4

3

看起来你有一个颜色表,它是一个存储颜色列表。

然后你就有了这个奇怪的硬编码色彩空间

颜色的分量是 4 的倍数,“不太亮”但“也不太暗”。

此功能似乎为您提供了与您的颜色表“对比”最佳的颜色。

当我说对比度时,这是通过使用 2 范数从颜色表中选择尽可能远的颜色来定义的。

于 2009-02-26T04:54:56.460 回答
1

给定一个名为 colorTable 的全局 Color 对象数组,此函数将从以下颜色空间中找到与该数组中的每个颜色最近*的颜色,然后是最远的颜色之一:

红色、绿色、蓝色分量为 4 的倍数 Red+Green+Blue 介于 256 和 512 之间

*:“最接近”定义为每个颜色分量的最小差平方和。

正如 Paul 所确定的那样,这似乎是一种看似合理的方法,如果实施效率极低,那么天真的方法可以找到与 colorTable 的内容提供高对比度的单一颜色。只需通过一次 colorTable 和更多的数学运算就可以找到相同的结果,而不是通过 colorTable 大约 500 万次,并且有更好的方法来找到提供更高平均对比度的不同颜色。

于 2009-02-26T05:00:44.060 回答
0

它试图给你另一种颜色

a) 对数据集进行伪彩色编码。

b) 在图上画另一条线。

于 2009-02-26T05:12:35.763 回答
0

考虑由 colorTable 中的点定义的伪实体在其内部有一个大的“空心”的情况,以便 nextColor 选择该空心中心的点作为 nextColor。根据您对 colorTable 的了解,这种情况可能非常罕见。如果预测它足够罕见,并且您愿意在这些情况下接受不是最优的(假设我们将 nextColor 的输出设为最优)解决方案,那么就会出现显着的优化。

在除上述情况之外的所有情况下,nextColor 选择的颜色将位于最小凸包表面的某个位置,该最小凸包包含由循环定义的 1/64 密集颜色空间中的所有点。在该表面上生成点列表在计算上比生成所有点列表的简单循环稍微复杂一些,但它会将您的搜索空间减少大约 25 倍。

在绝大多数情况下,简化搜索的结果将是该凸包的一个角上的一个点。只考虑那些可以将您的搜索空间减少到一个微不足道的列表(24 个候选人,如果我的心理几何学对我有用的话),可以简单地提前存储。

如果从中选择的 nextColor 与您的 colorTable“太接近”,那么您可以返回运行原始类型的搜索,以希望找到上述那种“空心”。该搜索的密度可以根据第一遍的接近程度进行调整,并从那里缩小范围。也就是说,如果超快速搜索在 colorTable 中找到距离其最近邻居 8 个单位的 nextColor,那么要做得更好,您必须在 colorTable 中找到至少 16 个单位的空心。以 8 的步长运行原始搜索并存储任何距离超过 4 个单位的候选对象(空心不太可能与您的搜索网格对齐),然后在每个候选对象上以更高密度的半径 12 搜索为中心。

我突然想到,您的搜索空间的 1/64 密集性质(所有 4 的倍数)可能是原作者为了加快搜索速度而设立的。鉴于这些改进,您消除了这种妥协。

所有这些都假定您想要坚持改进这种寻找对比色的幼稚方法。当然有更好的方法,给定相等或更多(colorTable 中的哪些颜色在您的使用中最普遍?哪些颜色对人眼看起来更具对比度?)信息。

于 2009-02-28T03:19:10.057 回答