【问题标题】:Detect if color is in range [duplicate]检测颜色是否在范围内[重复]
【发布时间】:2012-11-11 09:56:16
【问题描述】:

可能重复:
“Distance” between colours in PHP

我想检测一个 RGB 值是否是某种粉红色。我不确定如何进行此操作,因为似乎没有一系列 RGB 或十六进制值遵循粉红色的线性顺序(一种粉红色是255, 182, 193; #FFB6C1,而另一种是238, 162, 173; #EEA2AD)。假设我知道我的范围的开始和结束 RGB/十六进制值,你知道该怎么做吗?

【问题讨论】:

  • 尝试转换为 HSV 并在那里进行比较。
  • 在将其标记为骗子之前请仔细阅读...

标签: php


【解决方案1】:

对我来说它看起来相当线性。不过,你需要了解一点色彩理论。

在回答您的问题之前,我希望您不要介意我在此处包含一个简单的色彩理论复习。但它有助于理解或制定任何解决方案。

首先,我相信大多数人都会记得他们在幼儿园学到的色轮:

                                          Red
       Red                        Orange   |   Purple
        |                                \_|_/
       _o_        ---------->             _o_
      /   \                              / | \
  Yellow   Blue                   Yellow   |   Blue
                                         Green

好吧,我们需要稍微修改一下。因为事实证明,红色和蓝色并不是真正的原色,因为您可以通过将洋红色和黄色混合来获得红色,并且可以通过将青色和一点红色混合来获得蓝色。所以修改后的色轮使用打印颜色:CMY:

        Magenta
     Red   |   Blue
         \_|_/
          _o_
         / | \
  Yellow   |   Cyan
         Green

这基本上是 HSV 颜色空间(S 通常从中心到轮子边缘绘制,而 V 根本不绘制,但通常可以通过滑块更改)。它源自印刷颜色 CMY。那么这如何帮助我们处理屏幕颜色 RGB?

好吧,如果您仔细观察它,您会发现它实际上是印刷和屏幕色彩空间的组合。它实际上描绘了CMY和RGB之间的关系:

        Magenta                 Magenta
     Red   |   Blue                |           Red     Blue
         \_|_/                     |              \_ _/
          _o_            ==       _o_       +       o
         / | \                   /   \              |
  Yellow   |   Cyan         Yellow    Cyan          |
         Green                                    Green

所以,任何 RGB 颜色都可以通过了解这个色轮来理解。例如,RGB 中没有黄色。但请注意,黄色与蓝色相反。因此,要获得黄色,请从颜色中减去蓝色:

rgb(100,80,10)  is a "yellowish" version of rgb(100,80,120)
            ^                                           ^

一旦您了解了这个使用 RGB 值的色轮就更有意义了。通过足够的练习,您可以直接以#rrggbb 语法编写和编辑颜色,而无需参考颜色图表。

所以,回答你的问题。假设你的目标粉红色是:

rgb(255,182,193)

关于“粉色”,我们知道两件事:

  1. 我们认为它是一种红色。因此,目标颜色具有较高的红色值(实际上是最大值)是有道理的。

  2. 我们认为它是一种非常浅的红色。因此,非红色分量也相当高(均高于 150)是有道理的。

因此,要使色调接近您的目标颜色,我们需要:

  1. R 值明显高于 G 或 B。
  2. 所有值都相当高(超过 150 左右)。

根据这个定义,我们可以将粉色识别为:

// Pseudo code:

is_pink (R,G,B) {
    return R > 200 &&  // make sure R is high
           G > 150 &&  // make sure G & B are relatively high
           B > 150 &&
           R > G &&    // make sure G & B are not higher than R
           R > B;
}

我们可以通过确保 G 和 B 非常相似来添加另一个条件来拒绝略带蓝色或绿色的“粉红色”:

// Pseudo code:

is_pink (R,G,B) {
    return R > 200 &&
           G > 150 &&
           B > 150 &&
           R > G &&
           R > B &&
           abs(G-B) < 20; // make sure it's neither bluish or greenish
}

您可以调整值 200、150 和 20 以适应您对粉红色的品味,但您会发现,如果我们将上述函数应用于您的测试颜色 (255,182,193)(238,162,173),它们都会被识别为“粉红色”。

【讨论】:

  • 这是我在 Stackoverflow 上读到的最佳答案之一。非常感谢。
猜你喜欢
  • 2011-07-17
  • 2018-11-22
  • 2014-06-19
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多