【问题标题】:Best algorithm for matching colours.匹配颜色的最佳算法。
【发布时间】:2010-12-13 07:15:39
【问题描述】:

我有一个 RGB 格式的大约 200 种颜色的数组。我想编写一个程序,它采用任何 RGB 颜色并尝试匹配数组中最“相似”的颜色。

我需要一个“相似”的良好定义,尽可能接近人类的感知。

我还想展示一些关于匹配准确性的信息。例如黑白:100% 和色调稍有不同的相似颜色:-4%。

我需要使用神经网络吗?有没有更简单的选择?

【问题讨论】:

  • 是关于什么可能是一个好的相似性函数的建议的问题,还是关于快速找到数组中相对于给定颜色的最相似颜色的算法的问题?
  • 两者。如果首先我需要一些相似性的定义,然后我才能尝试装箱算法。我认为“感知上的相似”是我一直在寻找的。​​span>

标签: algorithm graphics language-agnostic color-space


【解决方案1】:

将所有颜色转换为CIE Lab color space 并计算该空间中的距离

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2)

具有最低 deltaE 的颜色在感知上最相似。

【讨论】:

  • 谢谢,这正是我所需要的。
  • 请记住,您不需要执行 sqrt - sqrt 是一个递增函数,因此这一步是多余的。
  • 你是对的,如果你只做排序,距离的平方和距离本身一样好。如果你想比较“有多么不同”,那就留下来吧。
  • CIE Lab 正是以这种方式用于在所有主要色彩管理系统(例如 Apple、Microsoft 和 Adob​​e 的系统)中进行最接近颜色计算。这是一个非常有趣的话题。
  • 根据您的经验,deltaE 的低值是什么?即当 deltaE
【解决方案2】:

不,这里不需要神经网络!只需将 HSL 颜色值视为一个向量,然后为该向量定义一个加权模函数,如下所示:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1);

where a,b,c are weights you should decide based on your visual definition of what
creates a bigger difference in perceived color - a 1% change in Hue or a 1%
change in Saturation

我建议你使用 a = b = 0.5 和 c = 1

最后,找出模数的范围,并将相似的颜色定义为模数非常接近的颜色(比如 5%)

【讨论】:

  • 这是一个很好的简单替代方案。从 RGB 到 HSL 的转换比从 RGB 到 Lab 的转换要简单得多。 :)
  • Crimson,你能检查一下你的模数的数学吗?我不认为这是对的。你想要更像a * (H1 - H2)**2 + ...,是吗?
  • @hobbs - 最好先计算两个模数然后比较它们,而不是只计算差向量的模数
  • 但是您不想将两种不同颜色的色调等相乘,是吗?
  • 您好,我想知道您所说的“找出模数的范围”是什么意思?我们只是使用 abs(mod1 - mod2) 或其他东西比较两种颜色模数还是“找出范围”意味着不同的东西?
【解决方案3】:

我还要指出least squares 方法,只是稍微简单一些。也就是说,你取一个数字的差,平方它,然后将所有这些平方差相加。

【讨论】:

    【解决方案4】:

    我一直在寻找这个东西,但没有找到很多答案,我决定创建这个小库。

    https://github.com/sebastienjouhans/c-sharp-colour-utilities

    【讨论】:

    • 在发布宣传您自己作品的答案时,请务必小心。确保您在此处实际回答了问题,并且仅使用您的博客/来源作为备份和参考。目前这很可能被标记为垃圾邮件。
    【解决方案5】:

    我实现这一目标的最快方法是将颜色添加到八叉树中,然后,就像量化一样,您使用每一位来引导您到最深的子节点。一旦你不能再深入,要么你处于最深层次(最低位),在这种情况下你已经达到了确切的颜色,或者你需要的下一个子节点不存在——此时你只是需要与您正在搜索的位最接近的位的孩子,这是您最接近的颜色。这比将所有内容都转换为 HSL 并返回,或者计算每个欧几里得距离要快得多。

    这是我在 CodeProject 上的代码:https://www.codeproject.com/tips/1046574/octtree-based-nearest-color-search

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 2011-12-21
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2010-10-04
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多