【问题标题】:How do I determine if a color is closer to white or black?如何确定颜色更接近白色还是黑色?
【发布时间】:2012-04-04 13:20:31
【问题描述】:

我正在处理图像并想确定一组像素是否更接近白色或黑色。

那么给定一组颜色/像素,如何确定它们更接近白色还是黑色?

我尝试了一些noobish算法,有人知道我该怎么做吗?

【问题讨论】:

  • 在 RGB 世界中,白色是 255,255,255,黑色是 0,0,0。看起来您可以将这三个取平均值,然后确定结果是更接近 0(黑色)还是 255(白色)。
  • 是的,我在我的一个“noobish”解决方案中尝试了这种平均,但效果不佳。

标签: java image-processing colors


【解决方案1】:
  • 将颜色转换为灰度(灰度颜色具有所有 3 个 RGB 分量,请参阅convert color image to grayscale)。

  • 检查灰度是否更接近黑色 (0) 或白色 (255)

【讨论】:

    【解决方案2】:

    白色和黑色有两种可能的含义:

    • 可见光的色谱
    • 人类肤色由种族、棕褐色程度等决定。

    前者很简单:转换为 0-255 的灰度范围。 127 或以下更接近黑色 (0),128 或以上更接近白色 (255)。

    我使用以下函数使用亮度值转换为灰度(假设输入颜色为 int ARGB 格式):

    public static int getLuminance(int argb) {
        int lum= (   77  * ((argb>>16)&255) 
                   + 150 * ((argb>>8)&255) 
                   + 29  * ((argb)&255))>>8;
        return lum;
    }
    

    后一种定义(人类肤色)不可能用简单的算法来完成,因为它取决于光线条件、相机设置、曝光等。(190,115,60)的 RGB 值可能大约是典型条件下的中点

    【讨论】:

      【解决方案3】:

      我会说您可以先将颜色转换为灰度,然后检查它是否更接近黑色或白色。

      首先将RGB颜色值转换为通过以下公式计算亮度

      Y = 0.2126*R + 0.7152*G + 0.0722*B
      

      然后检查该值是否更接近 0 或 255 并相应地选择黑色或白色

      color c = Y < 128 ? black : white
      

      请注意,如果色彩空间没有经过伽马压缩,则此方法效果很好,否则您必须在计算亮度之前添加一个步骤,即 伽马扩展,计算 Y,然后执行 伽玛压缩以获得非线性亮度值,然后您可以使用该值来确定颜色是否更接近黑色或白色。

      【讨论】:

      • 你能告诉我一个例子,我可以测试看看是否有伽马压缩并获得适当的亮度值,这种方法似乎符合我的需要
      • 您无法测试是否存在伽马压缩。你必须事先知道,伽玛压缩是如何用幂函数“去线性化”RGB值的,如果这是在你的颜色上完成的,那么你必须在计算亮度之前进行反向操作,就是这样..
      • 在 Android 中有一个可以使用的内置方法:Color.luminance()。它返回一个介于 0 和 1 之间的浮点数,0 表示绝对黑色,1 表示绝对白色。
      • 遗憾的是,API 24 中添加了 Color.luminance()。
      【解决方案4】:

      看看YCbCr。由于 Java 和大多数计算机以 RGB 格式处理颜色,因此您需要进行一些从 RGB 到 YCbCr 的转换。有许多公式可以将 RGB 转换为 YCbCr。

      一旦得到 YCbCr 值,就可以检查亮度值(YCbCr 中的 Y 值)。

      【讨论】:

      • 这是您正在寻找的答案。 1+
      猜你喜欢
      • 2021-07-19
      • 2015-11-21
      • 2021-06-23
      • 2011-04-25
      • 2022-01-05
      • 1970-01-01
      • 2023-03-15
      • 2021-04-14
      • 2013-06-22
      相关资源
      最近更新 更多